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 |