std::set
STL에 포함되는 std::set은 중복이 없이 정렬된 데이터를 쉽게 관리할 수 있게 해주는 컨테이너로 내부적으로는 균형 이진 검색 트리(레드-블랙 트리)를 사용하여 요소를 저장한다.
가장 큰 특징은 중복을 허용하지 않으므로 모든 요소는 유일하며, 요소를 추가, 삭제, 검색할 때 std::set은 O(log n)을 보장한다.
1. set에 요소 추가하기
set에 요소를 추가할 때는 .insert() 메소드를 사용한다. 삽입 시도 시 중복 요소가 없으면 성공적으로 추가되고, 중복 요소가 있으면 추가되지 않는다.
#include <iostream>
#include <set>
int main() {
std::set<int> mySet;
// 요소 추가
mySet.insert(3);
mySet.insert(1);
mySet.insert(4);
// 중복 요소 추가 시도 (이 요소는 추가되지 않음)
mySet.insert(1);
// 요소 출력
for (int elem : mySet) {
std::cout << elem << " ";
}
// 출력: 1 3 4
}
2. set에 요소 검색하기
set에서 특정 요소가 존재하는지 확인하기 위해서는 .find() 메소드를 사용할 수 있다. .find() 메소드는 요소를 찾으면 해당 요소를 가리키는, 찾지 못하면 end()를 가르키는 iterator를 반환한다.
if (mySet.find(3) != mySet.end()) {
std::cout << "3이 존재합니다." << std::endl;
} else {
std::cout << "3이 존재하지 않습니다." << std::endl;
}
3. set에 요소 삭제하기
set에서 요소를 삭제할 때는 .erase() 메소드를 사용한다. .erase() 메소드의 파라미터로 삭제하려는 요소의 값을 직접 전달하거나, 삭제하려는 요소를 가리키는 iterator를 전달할 수 있다.
mySet.erase(3); // 값 3을 가진 요소를 삭제
4. set에서 범위기반 삭제하기
.erase() 메소드와 함께 반복자를 사용하여 특정 범위의 요소를 한 번에 삭제할 수도 있다.
auto start = mySet.begin();
auto end = mySet.find(3);
mySet.erase(start, end); // 시작부터 3 전까지의 요소를 삭제
5. 사용자 정의 타입으로 set 사용하기
사용자 정의 타입을 저장할 때도 set을 사용할 수 있는데, set은 내부적으로 요소를 오름차순 정렬하므로 <연산자에 대한 비교 함수를 제공해야 한다.
struct MyStruct {
int value;
bool operator<(const MyStruct& other) const {
return value < other.value;
}
};
std::set<MyStruct> myCustomSet;
'프로그래밍 > C++' 카테고리의 다른 글
C++ ] std::unique_lock과 std::lock_guard의 차이 (0) | 2024.05.04 |
---|---|
C++ ] std::unordered_map과 std::map의 차이, unordered_map의 사용법 (0) | 2024.04.26 |
C++ ] std::iota 사용법 (0) | 2024.04.19 |
C++ ] leetCode 3005 - Count Elements With Maximum Frequency (0) | 2024.04.16 |
C++ ] std::stack 사용법 (0) | 2024.03.20 |