multiset은 set과 다르게 key가 중복으로 저장 됩니다.

 

[ multiset의 insert() 멤버 함수 ]

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <iostream>
#include <set>
 
using namespace std;
 
int main(){
 
    // multiset은 원소 중복 가능
    multiset<int> ms;
    ms.insert(50);
    ms.insert(30);
    ms.insert(80);
    ms.insert(80);
    ms.insert(30);
    ms.insert(70);
    
    multiset<int>::iterator Iter;
 
    // 저장된 위치의 반복자를 리턴
    Iter = ms.insert(10);
 
    cout<< "Iter의 원소 : " << *Iter <<endl;
    for( Iter = ms.begin(); Iter != ms.end(); ++Iter ){
        cout<< *Iter <<" ";
    }
    cout<<endl;
 
    system ("pause");
    return 0;
}

 

위의 예제 multiset의 구조

 

   50 

 30                   80

 10             30        70           80

 

mutiset의 탐색순서 : 10   30   30   50   70   80   80  ( 정렬 기준 less( < 연산 ) )

 

mutiset의 insert() 멤버함수는 중복 저장이 될 수 있으므로, set의 삽입 성공(중복)유무를 담는 pair객채를 리턴하지 않아도 됩니다.

즉! 저장된 위치만을 가리키는 반복자를 반환 합니다.

 

 

[ multiset의 count(), find(), lower_bound(), upper_bound() 멤버 함수( 찾기 관련 함수 ) ]

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include <iostream>
#include <set>
 
using namespace std;
 
int main(){
 
    // multiset은 원소 중복 가능
    multiset<int> ms;
    ms.insert(50);
    ms.insert(30);
    ms.insert(80);
    ms.insert(80);
    ms.insert(30);
    ms.insert(70);
    ms.insert(10);
    
    multiset<int>::iterator Iter;
    for( Iter = ms.begin(); Iter != ms.end(); ++Iter ){
        cout<< *Iter <<" ";
    }
    cout<<endl;
 
    // count() 멤버 함수
    cout<< "30 원소의 개수 : " << ms.count(30) <<endl;
 
    // find() 멤버 함수 
    Iter = ms.find(30); //30 첫번째 원소의 반복자
    cout<<"Iter : "<<*Iter << endl;
 
    multiset<int>::iterator Iter_lower;
    multiset<int>::iterator Iter_upper;
 
    // lower_bound(), upper_bound() 멤버 함수
    Iter_lower = ms.lower_bound(30); // 30 순차열의 시작 반복자
    Iter_upper = ms.upper_bound(30); // 30 순차열의 끝 반복자
   
    // 30 != 40
    if( Iter_lower != Iter_upper ){
        cout<<"ms에 있음!";
    }else{
        cout<<"ms에 없음!";
    }
    cout<<endl;
 
    //
    cout<<"[lower_bound, upper_bound)의 순차열 : ";
    Iter_lower = ms.lower_bound(10);
    Iter_upper = ms.upper_bound(80);
 
    for( Iter = Iter_lower; Iter != Iter_upper; ++Iter){
        cout<< *Iter << " ";
    }
    cout<<endl;
 
    system ("pause");
    return 0;
}



[ lower_Iter와 upper_Iter  ]

 

        Iter

10        30        30        50        70         80        80       N

    lower_Iter      upper_Iter

 

마지막 중복원소의 다음 원소인 (50)을 upper_Iter가 가르킴

 

 

[ 결과 ]

 


 

 

[ multiset의 equal_range() 멤버 함수 ]

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <iostream>
#include <set>
using namespace std;
 
int main(){
    
    multiset<int> ms;
 
    ms.insert(50);
    ms.insert(30);
    ms.insert(80);
    ms.insert(80);
    ms.insert(30);
    ms.insert(70);
    ms.insert(10);
    ms.insert(80);
 
    multiset<int>::iterator Iter;
    for( Iter = ms.begin(); Iter != ms.end(); ++Iter ){
        cout<<*Iter<<" ";
    }
    cout<<endl;
    
    // equal_range() 멤버함수 사용
    // 10 30 30 50 70 80 80 80
 
    pair<multiset<int>::iterator, multiset<int>::iterator> pr;
    pr = ms.equal_range(80);
 
    // [lower, upper) 구간의 순차열
    cout<<"구간 [lower, upper)의 순차열 : ";
    for( Iter = pr.first; Iter != pr.second; ++Iter ){
        cout<<*Iter<<" "// 80 80 80
    }
    cout<<endl;
 
    system("pause");
    return 0;
}

 

+ Recent posts