C++ 에는 시퀀스 컨테이너들 (vector,list,deque) 3종류 외에 다른 종류의 컨테이너인연관 컨테이너(associative container) 의 셋(set) 과 맵 (map) 에 대해서 알아보겠습니다.
연관 컨테이너는 시퀀스 컨테이너와는 다르게 키(key) - 값(value) 구조를 가집니다.
위 처럼 연관 컨테이너는 키를 바탕으로 이에 대응되는 값을 얻을 수 있는 구조 입니다.
#include<iostream>
#include<set>
usingnamespacestd;
template <typenameT>
voidprint_set(set<T>&s) {
// 셋의 모든 원소들을 출력하기
cout<<"[ ";
for (typenameset<T>::iteratoritr = s.begin(); itr != s.end(); ++itr) {
cout << *itr << " ";
}
cout<<" ] "<<endl;
}
intmain() {
set<int> s;
s.insert(10);
s.insert(50);
s.insert(20);
s.insert(40);
s.insert(30);
cout<<"순서대로 정렬되서 나온다"<<endl;
print_set(s);
cout<<"20 이 s 의 원소인가요? :: ";
autoitr = s.find(20);
if (itr!=s.end()) {
cout<<"Yes"<<endl;
} else {
cout<<"No"<<endl;
}
cout<<"25 가 s 의 원소인가요? :: ";
itr=s.find(25);
if (itr!=s.end()) {
cout<<"Yes"<<endl;
} else {
cout<<"No"<<endl;
}
}
set의 경우 insert() 함수가 어디에 추가할지 정보없이 추가되며, 삽입된 원소가 순서대로 자동으로 정렬되어 있습니다.
시퀀스 컨테이너가 상자 하나에 원소를 한 개 씩 담고, 각 상자에 번호를 매긴 것이라면, 셋은 그냥 큰 상자 안에 모든 원소들을 쑤셔 넣은 것이라 보면 됩니다. 그 상자 안에 원소가 어디에 있는지는 중요한게 아니고,그 상자 안에 원소가 '있냐/없냐' 만이 중요한 정보입니다.
셋에는find(0함수가 제공되며, 이find()함수를 통해 이 셋에 원소가 존재하는지 아닌지 확인할 수 있습니다.
또한 셋의 중요한 특징으로 바로 셋 안에는 중복된 원소들이 없다는 점이 있습니다.
set은 순서대로 정렬된 원소를 순서대로 찾아주기때문에 중복된 원소가 있을 수 없습니다.
참고로 시퀀스 컨테이너들과 마찬가지로set역시 범위 기반 for 문을 지원합니다. 원소들의 접근 순서는 반복자를 이용해서 접근하였을 때와 동일합니다.
다만, 이렇게 set의 경우 순서대로 정렬해야하기때문에 직접 만든 class 객체를 저장하기 위해서는 서로의 순서를 비교할수 있는 operator< 를 오버로딩해주어야 합니다.