Set
STL set 개념정리 및 예시코드
정의
정렬된 고유한 요소들의 집합을 저장하는 STL(Standard Template Library) 컨테이너
- 레드-블랙 트리(Red-Black Tree)를 기반으로 정렬된 균형 이진 탐색 트리(BST)
- 기본적으로 오름차순(작은 값 → 큰 값)으로 정렬이 유지되고 중복된 값을 허용하지 않음
시간복잡도
- 삽입(insert), 삭제(erase), 탐색(find)의 시간 복잡도는 O(log N)
템플릿 정의
1
2
template <typename T, typename Compare = std::less<T>, typename Allocator = std::allocator<T>>
class set;
- T: 데이터 타입 (int, struct 등)
- Compare: 정렬 기준 (기본 값:
std::less<T>) - Allocator: 메모리 할당 (기본 값:
std::allocator<T>)Heap메모리를 사용하여node기반 동적 할당을 수행
사용 방법
오름차순 정렬 (기본)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <set>
int main() {
std::set<int> s;
s.insert(3);
s.insert(1);
s.insert(2);
for (auto i : s) {
std::cout << i << " ";
}
return 0;
}
기본적으로 std::set은 오름차순(작은 값 → 큰 값)으로 정렬됨
1
1 2 3
내림차순 정렬
std::set 선언할 때 std::greater<> 추가가
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <set>
int main() {
std::set<int, std::greater<int>> s;
s.insert(3);
s.insert(1);
s.insert(2);
for (auto i : s) {
std::cout << i << " ";
}
return 0;
}
내림차순(큰 값 → 작은 값)으로 정렬됨
1
3 2 1
사용자 정의 구조체 적용
특정 기준으로 정렬하고 싶다면, operator를 오버로딩하거나 compare 함수를 지정
operator 오버로딩
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
#include <iostream>
#include <set>
struct Task {
int score;
std::string name;
// score 낮은 순으로 정렬
bool operator<(const Task& other) const {
return score < other.score;
}
};
int main() {
std::set<Task> s;
s.insert({1, "Low"});
s.insert({3, "High"});
s.insert({2, "Medium"});
for (auto v : s) {
std::cout << v.name << " ";
}
return 0;
}
score 기준 오름차순으로 정렬됨
1
Low Medium High
compare 함수 이용
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
#include <iostream>
#include <set>
struct Task {
int priority;
std::string name;
};
// priority 숫자 높은순으로 정렬
struct Compare {
bool operator()(const Task& a, const Task& b) const {
return a.priority > b.priority;
}
};
int main() {
std::set<Task, Compare> s; // compare 함수
s.insert({ 1, "Low" });
s.insert({ 3, "High" });
s.insert({ 2, "Medium" });
for (auto v : s) {
std::cout << v.name << " ";
}
return 0;
}
priority 기준 내림차순으로 정리됨
1
High Medium Low
This post is licensed under CC BY 4.0 by the author.