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; } |
'0x0001 > STL' 카테고리의 다른 글
[C++ STL] 연관 컨테이너 - 멀티맵(multimap) (0) | 2019.02.23 |
---|---|
[C++ STL] 연관 컨테이너 - 맵(map) (0) | 2019.02.16 |
[C++ STL] 연관 컨테이너 - 셋(set) (0) | 2019.02.16 |
[C++ STL] 시퀀스 컨테이너 - 리스트(list) (0) | 2019.02.16 |
[C++ STL] 시퀀스 컨테이너 - 덱(deque) (0) | 2019.02.16 |