노드 기반의 컨테이너이며 균형 이진트리의 구조이다.
std::set<[type]> s
map과 마찬가지로 중복을 허용하지 않으며 삽입 할 시에 정렬이 된다.
cout << boolalpha;
std::set<int> s{ 1, 2, 3, 4 };
pair<set<int>::iterator, bool> result = s.insert(2);
cout << *result.first << endl;
cout << result.second << endl;
if (auto [iter, success] = s.insert(10); success) {
cout << *iter << endl;
cout << success << endl;
}
for (int num : s)
cout << num << ' ';
실행 결과
2
false
10
true
1 2 3 4 10
std::multset<[type]> ms
중복이 허용되며 multi map과 비슷한 구조를 가진다.
std::multiset<int> ms{
1, -1, 3, 10, 10, 3
};
cout << "ms : ";
for (const auto& num : ms)
cout << num << " ";
-1 1 3 3 10 10
set<int, (조건식)>
set과 multiset은 삽입을 할 때 기본적으로 오름차순 정렬이 이루어지지만
선언할 때 입력한 조건식을 입력한다면
조건에 맞추어 정렬하여 삽입이 이루어진다.
std::less<[type]>
container를 오름차순을 정렬해준다.
std::greater<[type]>
container를 내림차순을 정렬해준다.
struct Greater {
bool operator()(const int& lhs, const int& rhs) const {
return lhs > rhs;
}
};
set<int, std::less<int>> s0{ 3, 10, -1 };
cout << "s0 : ";
for (const auto num : s0)
cout << num << ' ';
cout << endl << "s1 : ";
set<int, std::greater<int>> s1{ 3, 10, -1 };
for (const auto num : s1)
cout << num << ' ';
cout << endl << "s2 : ";
set<int, Greater> s2{ 3, 10, -1 };
for (const auto num : s2)
cout << num << ' ';
cout << endl;
map<int, string, std::greater<int>> m{ {10, "20"}, {1, "30"} };
m[2] = "50";
for (auto [key, value] : m)
cout << key << " : " << value << endl;
실행 결과
s0 : -1 3 10
s1 : 10 3 -1
s2 : 10 3 -1
9 : 20
2 : 50
1 : 30
위와 같은 정렬식은 struct를 활용해 임의의 정렬 조건식을 만들 수 있으며
예제의 마지막 부분을 보아 map에서도 활용할 수 있다는 것을 알 수 있다.
또한 map에 greater정렬 조건을 붙여주어
중간에 key 2
가 삽입되어도 내림차순으로 정렬된 것을 볼 수 있다.