안녕하세요 ! BlockDMask 입니다.
오늘은, 연관 컨테이너(set, multiset, map, multimap)중 multiset 에 대해서 알아보겠습니다.!
set과 구별되는 multiset의 가장 큰 특징은 key값이 중복된다는 것 입니다.
나머지 연산자, 생성자, 멤버 변수는 동일합니다.
예시를 들고 예시에 사용된 멤버 변수만 설명하는 방식으로 이번글을 써보겠습니다.
설명한 부분 이외의 생성자, 연산자, 멤버 변수는 set container와 동일하므로 여기서 보시면 되겠습니다.
1) multiset container
- set container 와 같이 key 값을 저장합니다.
- set container 와 달리 중복된 key 값을 저장 할 수 있습니다.
- 원소를 삽입하면 자동으로 정렬이 됩니다.
2) multiset 의 사용법
- <set> 의 헤더 파일 안에 있습니다.! ( <multiset> 아닙니다!! )
- using namespace std; 를 사용하면 편리합니다.
- 선언 방법은 multiset< [Data Type] > [변수 이름] 입니다.
ex) multiset<int> ms;
ex) multiset<vector<int> > ms;
3) multiset 의 생성자와 연산자
- set 과 동일합니다 [바로가기]
4) multiset 의 멤버 변수
- set 과 동일합니다. [바로가기]
- 다른부분을 기제 해보겠습니다.
- ms.insert(k) 시에. set에서는 insert의 return 값이 pair 객체로 나왔지만, multiset에서는 중복이 가능하므로 insert의 return 값이 삽입한 원소 k 의 위치를 가리키는 반복자 입니다.
- set에서 의미없게 사용되던. lower_bound(), upper_bound(), equal_range() 멤버 변수가 multiset에서는 좀더 유용하게 사용됩니다.
5) multiset 예제
<Test 1> insert(), count()
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 | #include <iostream> #include <set> using namespace std; int main(void){ multiset<int> ms; ms.insert(9); ms.insert(13); ms.insert(5); ms.insert(7); ms.insert(3); ms.insert(1); ms.insert(11); ms.insert(15); multiset<int>::iterator iter; for(iter = ms.begin(); iter != ms.end(); iter++){ cout << *iter << " " ; } cout << endl; cout << "ms.count(11) : " << ms.count(11) << endl << endl; //원소값 3, 11, 11 을 추가해보겠습니다. ms.insert(3); ms.insert(11); ms.insert(11); for(iter = ms.begin(); iter != ms.end(); iter++){ cout << *iter << " " ; } cout << endl; cout << "ms.count(11) : " << ms.count(11) << endl ; return 0; } | cs |
- Test 1 결과
- Test 1을 그림으로 한번 살펴보겠습니다. 위쪽이 삽입 전, 아래쪽이 삽입 후 입니다.
<Test 2> upper_bound(), lower_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 | #include <iostream> #include <set> using namespace std; int main(void){ multiset<int> ms; ms.insert(9); ms.insert(13); ms.insert(5); ms.insert(11); ms.insert(7); ms.insert(11); ms.insert(3); ms.insert(1); ms.insert(11); ms.insert(15); multiset<int>::iterator iter; for(iter = ms.begin(); iter != ms.end(); iter++){ cout << *iter << " " ; } cout << endl; //이해를 돕기위해 반복자 start와 end를 선언하겠습니다. multiset<int>::iterator start, end; //key 11이 처음 나온 부분 [폐구간] start = ms.lower_bound(11); cout << "lower_bound(11) : " << *start << endl; //key 11의 마지막 부분 의 다음! (개구간) end = ms.upper_bound(11); cout << "upper_bound(11) : " << *end << endl; for(start; start!=end; start++){ cout << *start << " "; } cout << endl; return 0; } | cs |
- Test 2 결과
- Test2 의 lower_bound(11) 과 upper_bound(13)의 위치.
<Test 3> equal_range()
- equal_range는 반복자 두개를 원소로 가지고있는 pair 객체를 반환합니다.
- lower_bound()와 upper_bound()를 pair로 묶어 놨다고 생각하시면 됩니다.
- first 는 lower_bound() / second 는 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 | #include <iostream> #include <set> using namespace std; int main(void){ multiset<int> ms; ms.insert(9); ms.insert(13); ms.insert(5); ms.insert(11); ms.insert(7); ms.insert(11); ms.insert(3); ms.insert(1); ms.insert(11); ms.insert(15); multiset<int>::iterator iter; for(iter = ms.begin(); iter != ms.end(); iter++){ cout << *iter << " " ; } cout << endl; //pair<iter, iter> 를 통해 key 11 의 equal_range 를 받습니다. pair<multiset<int>::iterator, multiset<int>::iterator> equal_pair = ms.equal_range(11); for(iter = equal_pair.first ; iter != equal_pair.second; iter++){ cout << *iter << " " ; } cout << endl; return 0; } | cs |
- Test 3 결과
<참고>
'<개인공부> > [C++]' 카테고리의 다른 글
[C++] queue container 정리 및 사용법 (2) | 2017.08.03 |
---|---|
[C++] stack container 정리 및 사용법 (0) | 2017.08.02 |
[C++] multimap container 정리 및 사용법 (2) | 2017.07.29 |
[C++] map container 정리 및 사용법 (10) | 2017.07.28 |
[C++] set container 정리 및 사용법 (8) | 2017.07.26 |
[C++] list container 정리 및 사용법 (4) | 2017.07.25 |
[C++] deque container 정리 및 사용법 (2) | 2017.07.23 |
[C++] vector container 정리 및 사용법 (41) | 2017.07.20 |