Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++ STL multiset(멀티셋) insert() 함수 완벽 정리 – 사용법과 예제

C++ STL의 multiset insert() 함수는 멀티셋(multiset) 컨테이너에 새로운 요소를 삽입하는 데 사용되는 핵심 멤버 함수입니다. 단순히 값을 삽입하는 방식뿐만 아니라, 삽입 위치를 힌트로 제공하여 삽입 성능을 최적화하는 방식도 지원합니다. 이 글에서는 insert() 함수의 동작 원리와 실제 활용 예제를 자세히 살펴보겠습니다.

예제에서 사용되는 주요 함수

  • ms.size() – 멀티셋에 저장된 요소의 개수를 반환합니다.
  • ms.insert() – 멀티셋에 요소를 삽입합니다.
  • ms.empty() – 멀티셋이 비어 있는지 여부를 확인합니다.
  • ms.begin(), ms.end() – 멀티셋의 시작과 끝을 가리키는 반복자를 반환합니다.

insert() 함수의 대표적인 호출 형태

  • insert(val) – 값을 삽입하고, 삽입된 요소의 위치를 가리키는 반복자를 반환합니다.
  • insert(position, val) – position을 힌트로 사용하여 값을 삽입합니다. 힌트가 적절하면 삽입 속도가 크게 향상됩니다.
  • insert(first, last) – 지정한 반복자 범위에 있는 모든 요소를 한 번에 삽입합니다.

예제 코드

#include <iostream>
#include <set>
#include <string>
#include <cstdlib>
using namespace std;
int main() {
    multiset<int> ms;
    multiset<int>::iterator it, it1;
    int c, i;
    while (1) {
        cout<<"1.멀티셋 크기 확인"<<endl;
        cout<<"2.멀티셋에 요소 삽입"<<endl;
        cout<<"3.멀티셋 출력"<<endl;
        cout<<"4.종료"<<endl;
        cout<<"메뉴를 선택하세요: ";
        cin>>c;
        switch(c) {
            case 1:
                cout<<"멀티셋 크기: "<<ms.size()<<endl;
            break;
            case 2:
                cout<<"삽입할 값 입력: ";
                cin>>i;
                if (ms.empty())
                    it1 = ms.insert(i);
                else
                    it1 = ms.insert(it1, i);
            break;
            case 3:
                cout<<"멀티셋의 요소: ";
                for (it = ms.begin(); it != ms.end(); it++)
                    cout<<*it<<" ";
                cout<<endl;
            break;
            case 4:
                exit(1);
            break;
            default:
                cout<<"잘못된 선택입니다"<<endl;
        }
    }
return 0;
}

실행 결과

1.멀티셋 크기 확인
2.멀티셋에 요소 삽입
3.멀티셋 출력
4.종료

메뉴를 선택하세요: 1
멀티셋 크기: 0
1.멀티셋 크기 확인
2.멀티셋에 요소 삽입
3.멀티셋 출력
4.종료

메뉴를 선택하세요: 2
삽입할 값 입력: 1
1.멀티셋 크기 확인
2.멀티셋에 요소 삽입
3.멀티셋 출력
4.종료

메뉴를 선택하세요: 2
삽입할 값 입력: 2
1.멀티셋 크기 확인
2.멀티셋에 요소 삽입
3.멀티셋 출력
4.종료

메뉴를 선택하세요: 2
삽입할 값 입력: 4
1.멀티셋 크기 확인
2.멀티셋에 요소 삽입
3.멀티셋 출력
4.종료

메뉴를 선택하세요: 2
삽입할 값 입력: 6
1.멀티셋 크기 확인
2.멀티셋에 요소 삽입
3.멀티셋 출력
4.종료

메뉴를 선택하세요: 2
삽입할 값 입력: 7
1.멀티셋 크기 확인
2.멀티셋에 요소 삽입
3.멀티셋 출력
4.종료

메뉴를 선택하세요: 3
멀티셋의 요소: 1 2 4 6 7
1.멀티셋 크기 확인
2.멀티셋에 요소 삽입
3.멀티셋 출력
4.종료
메뉴를 선택하세요: 4
exit status 1

코드 설명

이 프로그램은 메뉴 기반으로 멀티셋을 조작하는 간단한 콘솔 애플리케이션입니다. 핵심 로직은 메뉴 2번의 삽입 부분에 있습니다.

  • 멀티셋이 비어 있으면 ms.insert(i)를 호출하여 힌트 없이 값을 삽입하고, 반환된 반복자를 it1에 저장합니다.
  • 멀티셋이 비어 있지 않으면 이전에 삽입된 위치를 나타내는 it1을 힌트로 사용하여 ms.insert(it1, i)를 호출합니다.

멀티셋은 내부적으로 항상 정렬된 상태를 유지하기 때문에, 오름차순으로 값이 계속 삽입되는 경우 마지막 삽입 위치를 힌트로 전달하면 탐색 과정을 생략하고 상수 시간(O(1))에 가까운 속도로 삽입할 수 있습니다. 만약 힌트가 부적절하더라도 정확성에는 문제가 없으며, 일반적인 삽입 방식으로 자동 처리됩니다.

또한 exit(1) 함수를 사용하여 프로그램을 종료하므로, <cstdlib> 헤더를 반드시 포함해야 합니다.

정리

multiset의 insert() 함수는 중복 값을 허용하면서 정렬된 순서를 유지하는 멀티셋의 특성을 그대로 살려 요소를 추가합니다. 힌트 기반 삽입을 잘 활용하면 대량의 데이터를 삽입할 때 성능을 눈에 띄게 개선할 수 있으므로, 실무에서도 적극적으로 활용할 가치가 있습니다.