본문 바로가기
프로그래밍/C++

C++ ] std::set 사용법

by eteo 2024. 4. 22.

 

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;