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

[C++11] std::set 을 알아보자.

by _BlankSpace 2018. 4. 29.

1. std::set 이란?


"std:set은 key 유형의 고유한 객체 (정렬된)집합을 포함하는 연관 컨테이너를 말한다.." 라고 보통 영어로 표현되어 있다.

std::set is an associative container that contains a sorted set of unique objects of type Key.

출처는 마지막에 있습니다.


위의 말이 이해가 되지 않는다면, 아래 글과 예제를 보면서 생각한다면 훨씬 이해하기 쉬우리라 믿는다.


우선, std:set을 사용하려면, 다음의 헤더가 필요하다.

1

#include <set>

cs


2. std:set의 장점 및 특징은?


1. 중복된 요소는 허용하지 않는다. 다시 말하면, 고유한 요소만 포함할 수 있다.

2. std::set은 템플릿 인자와 같은 특정한 타입의 요소도 포함할 수 있다.


위의 내용을 아래 예제 코드에서 확인해보자.

1

2

3

std::set<int> // int 인자만 포함한다.

class Example;

std::set<Example> // Example 클래스 객체만 포함한다.

cs


3. std:set는 내부적으로 balanced binary tree 형식으로 요소들이 저장되어 있다.

4. std:set은 두 요소를 '<' operator를 이용하여 비교할 수 있다.

  또한, 사용자가 외부적으로 정렬 기준을 전달하면, 기본 operator인 '<' 를 대신해서 사용한다.

5. std:set은 4번에서 말한 비교 방법을 기준으로 삽입되는 요소들을 정렬해놓는다.


3. std:set의 사용 예.


std::set을 이용한 간단한 예이다.

예를 보면 쉽게 이해할 것이다.


다음 예제에서 std::set의 사용방법을 확인해보자.

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
28
29
30
31
32
33
34
35
36
37
38
39
#include <set>
#include <string>
 
int main()
{
    std::set<int> setNum;
 
    // std::set 요소 추가.
    setNum.insert(5);
    setNum.insert(1);
    setNum.insert(3);
    setNum.insert(4);
    setNum.insert(2);
 
    // std::set의 사이즈 확인.
    std::cout << "Set Size : " << setNum.size() << std::endl;
 
    // std::set의 요소 출력.
    for (std::set<int>::iterator it=setNum.begin(); it!=setNum.end(); ++it)
        std::cout << ' ' << *it;
    std::cout << "\n";
 
    // std::set 요소 찾기.
    std::set<int>::iterator it = setNum.find(3);
    if (it != setNum.end()) {
        std::cout << "found number : \'3\'" << std::endl;
    }   
    else {
        std::cout << "not found number : \'3\'" << std::endl;
    }   
    
    // std::set 요소 삭제.
    setNum.erase(3);    
    for (std::set<int>::iterator it=setNum.begin(); it!=setNum.end(); ++it)
        std::cout << *it << std::endl;
            
    return 0;
}
 
cs


한 가지 알아야 할 점이 있다.

std::set의 요소들을 순차적으로 방문하려면 다음 코드를 이해 해야 한다.

iterator는 순차적으로 set의 요소를 방문하는 기능이라고 생각하면 된다.

iterator의 기능을 안다면, 다음 코드를 이해할 수 있을 것이다.

1

for (std::set<int>::iterator it=setNum.begin(); it!=setNum.end(); ++it)

cs


iterator 기능을 자세히 알아보려면 다음을 참고하자.

[iterator가 궁금하다면? 클릭해보자]


4. std:set의 요소 검색하기.


std::set에 요소를 넣은 후, 찾고자 하는 요소가 있는 지 확인할 필요가 있다.

이럴 경우, std::set::find를 사용할 수 있다.

1
std::set::find
cs


1
2
3
4
5
6
7
8
    // std::set 요소 찾기.
    std::set<int>::iterator it = setNum.find(3);
    if (it != setNum.end()) {
        std::cout << "found number : \'3\'" << std::endl;
    }   
    else {
        std::cout << "not found number : \'3\'" << std::endl;
    }   
cs

위의 예제에서는 3이 std::set에 추가되어 있으므로, "found number : 3" 이 출력될 것이다.


5. std::set의 요소 제거하기.


std::set의 요소를 삭제할 경우는 다음 명령어를 사용할 수 있다.

1
std::set::erase
cs

사용 예는 다음과 같다.
1
2
3
setNum.erase(3);    
for (std::set<int>::iterator it=setNum.begin(); it!=setNum.end(); ++it)
    std::cout << *it << std::endl;
cs

출처 : http://en.cppreference.com/w/cpp/container/set

http://thispointer.com/stdset-tutorial-part-1-set-usage-details-with-default-sorting-criteria/

댓글