본문 바로가기
<개인공부>/[C++]

[C++] multiset container 정리 및 사용법

by 사용자 BlockDMask 2017. 7. 27.
반응형

  • 안녕하세요 ! 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 의 생성자와 연산자


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 결과

<참고>

http://www.cplusplus.com/reference/set/multiset/

반응형

댓글0