728x90
반응형

 

Set 컨테이너에 대해서 공부해보았다. Set은 연관 컨테이너 중 하나이다. 다음은 연관 컨테이너의 특성이다.

  • 원소들을 검색하기 위한 키(key)를 가지고 있다. (키와 값의 쌍 형태로 저장되는 컨테이너도 있다)
  • 자료들은 정렬되어 있다. (하지만 순서는 의미가 없다)
  • 삽입되는 요소의 위치를 지정할 수 없다.
  • Tree 구조를 기반으로 동작한다.

Set 컨테이너는 '집합'이다. 

중학교 때 배우는 집합의 특징에 대해서 생각해 볼 수 있다.

  • 중복이 허용되지 않는다.
  • 순서가 상관이 없다.

Set이라는 컨테이너는 집합의 특징을 그대로 갖는다. 그리고 이 집합 내에 저장되는 요소를 키(key)라고 한다.

그러나 중복이 허용되는 집합 컨테이너가 존재한다. 다중 집합인 multi-set이다.
중복이 허용되는 것을 제외하면 set과 똑같다. 

간단한 컨테이너 개념이기 때문에 코드로 바로 정리한다.

 

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
58
59
60
61
62
// https://colorscripter.com/
#include <iostream>
#include <set>
 
using namespace std;
 
template <typename T>
void print_list(const T& c);
 
int main(void)
{
    set<int> my_set;
    multiset<int> my_multiset;
 
    set<int>::iterator set_it;
    multiset<int>::iterator multiset_it;
 
    cout << "set에서의 요소 추가" << endl;
    my_set.insert(6);
    my_set.insert(7);
    my_set.insert(8);
    my_set.insert(8); // 중복 값이기 때문에 insert가 이루어지지 않음.
    print_list(my_set);
 
    cout << "multi set에서의 요소 추가" << endl;
    my_multiset.insert(100);
    my_multiset.insert(100); // 중복 값 허용이므로 insert가 이루어진다.
    my_multiset.insert(my_set.begin(), my_set.end());
    print_list(my_multiset);
 
    cout << "set에서의 요소 탐색" << endl;
    set_it = my_set.find(8);
    if (set_it != my_set.end())
        cout << *set_it << " 가 발견됨." << endl;
 
    cout << "multi set에서의 요소 탐색" << endl;
    multiset_it = my_multiset.find(100);
    if (multiset_it != my_multiset.end())
        cout << *multiset_it << " 가 발견됨." << endl;
 
    cout << "set에서의 요소 삭제(6)" << endl;
    my_set.erase(6); 
    print_list(my_set);
 
    cout << "multi set에서의 요소 삭제(100)" << endl;
    my_multiset.erase(100); // 100 요소가 여럿인 경우 모두 삭제
    print_list(my_multiset);
 
    return 0;
}
 
 
template <typename T>
void print_list(const T& c)
{
    typename T::iterator it;
    // typename을 붙이는 이유 : 
    // 붙이지 않을 경우 T::iterator에서 iterator을 T 클래스 내의 변수로 생각하기 때문에 T::iterator 자체가 type이라는 것을 명시해야함.
    for (it = c.begin(); it != c.end(); it++)
        cout << "iterator value : " << *it << endl;
    return;
}
cs

먼저, 21, 22번 라인처럼 set 컨테이너에 같은 값을 키로 등록하려고 하는 경우, 나중에 추가되는 중복 값은 추가되지 않고 무시된다. 내부적으로 조건에 의하여 처리된다.

반면, 26, 27번 라인처럼 multiset 컨테이너에서는 중복 값 추가가 허용된다.

46번 라인처럼 multiset컨테이너에서 중복되는 값을 삭제한다면 중복되는 값들 모두 사라진다. 예를 들어 100이 두개 들어있는 multiset의 경우에서 erase(100)을 실행하면 100 두 개가 모두 사라진다.

728x90
반응형

'프로그래밍응용 > Modern & STL' 카테고리의 다른 글

Pair  (0) 2021.01.03
Map  (0) 2020.09.15
List  (0) 2020.09.14
Deque  (0) 2020.09.13
모든 컨테이너 공통 멤버  (0) 2020.09.13

+ Recent posts