관리 메뉴

Kim's Programming

STL(Standard Template Library) - Container - Set 본문

STL - Container

STL(Standard Template Library) - Container - Set

Programmer. 2016. 1. 28. 02:18

set은 키를 저장하는 이진탐색 트리 형태의 자료구조의 형태입니다. map은 키와 값을 같이 저장한다는 것과 조금 다릅니다. 데이터가 들어가면 이진탐색트리처럼 오름, 내림차순으로 정렬되며 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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
#include<set>
#include<iostream>
 
void print(std::set<int> Target_Set)
{
    for (std::set<int>::iterator IterPos = Target_Set.begin(); IterPos != Target_Set.end(); ++IterPos)
        std::cout << *IterPos << " ";
    std::cout << std::endl;
}
bool function(int x)
{
    if (x > 5)
        return true;
    return false;
}
void main()
{
    std::set<int> Set;//Set is binary Search Tree
    std::set<int> Set_Copy;
    std::set<int>::iterator Iter;
 
    //insert() function insert data in set, but same value is denied
    std::cout << std::endl << "insert()" << std::endl;;
    Set.insert(8);
    Set.insert(3);
    Set.insert(1);
    Set.insert(3);
    Set.insert(6);
    Set.insert(3);
    print(Set);
 
    //begin() function return Iterator that point first data in set
    std::cout << std::endl << "begin()" << std::endl;;
    std::cout << *Set.begin() << std::endl;
 
    //cbegin() function return const Iterator that point first data in set
    std::cout << std::endl << "cbegin()" << std::endl;
    std::cout << *Set.cbegin() << std::endl;
 
    //cend() function return const Iterator that point next to last data in set
    std::cout << std::endl << "cbegin()" << std::endl;
    std::cout << *(--Set.cend()) << std::endl;
 
    //Operator 'x1 = x2 ' copy x2 to x1 
    std::cout << std::endl << "operator '=' " << std::endl;
    std::cout << " Previous Set --> "; print(Set);
    std::cout << " Previous Set_Copy --> "; print(Set_Copy);
    Set_Copy = Set;
    std::cout << " After Set --> "; print(Set);
    std::cout << " After Set_Copy --> "; print(Set_Copy);
 
    //clear() function clear all data in set
    std::cout << std::endl << "Clear()" << std::endl;
    std::cout << " Previous Set_Copy --> "; print(Set_Copy);
    Set_Copy.clear();
    std::cout << " After Set_Copy --> "; print(Set_Copy);
 
    //count(x) function count number of 'x' and return it
    std::cout << std::endl << "count(3)" << std::endl;
    std::cout << Set.count(3<< std::endl;
 
    //crbegin() function return const Iterator that point first data in set(reverse)
    std::cout << std::endl << "crbegin()" << std::endl;
    std::cout << *Set.crbegin() << std::endl;
 
    //crbegin() function return const Iterator that point last data in set(reverse)
    std::cout << std::endl << "crend()" << std::endl;
    std::cout << *(--Set.crend()) << std::endl;
 
    //emplace(x) function insert 'x' in set 
    std::cout << std::endl << "empalce()" << std::endl;
    std::cout << " Previous Set --> "; print(Set);
    Set.emplace(15);
    std::cout << " After Set --> "; print(Set);
 
    //emplace_hint(x,y) function insert 'y' at specific position Iterator 'x' points in set 
    std::cout << std::endl << "emplace_hint()" << std::endl;
    std::cout << " Previous Set --> "; print(Set);
    Set.emplace_hint(Set.begin(),2);
    std::cout << " After Set --> "; print(Set);
    
    //if set is empty, empty() function return true
    std::cout << std::endl << "empty()" << std::endl;
    if (Set.empty())
        std::cout << "Set is empty" << std::endl;
    else
        std::cout << "Set is not empty" << std::endl;
 
    //equal_range() function 
    std::cout << std::endl << "equal_range()" << std::endl;
    std::cout << *(--Set.end()) << std::endl;
    
 
    //erase(x) function delete all x data in set
    std::cout << std::endl << "erase()" << std::endl;
    std::cout << " Previous Set --> "; print(Set);
    Set.erase(3); 
    std::cout << " After Set --> "; print(Set);
    
    //if x in set find(x) function return end()
    std::set<int>::iterator Iter_Find;
    std::cout << std::endl << "find(2)" << std::endl;
    Iter_Find = Set.find(2);
    if (Iter_Find != Set.end())
        std::cout << *Iter_Find << std::endl;
    else
        std::cout << "No Data" << std::endl;
 
    //max_size() function return set's max_size
    std::cout << std::endl << "max_size()" << std::endl;
    std::cout<<Set.max_size()<<std::endl;
 
    //rbegin() function return Iterator that point first data(reverse)
    std::cout << std::endl << "rbegin()" << std::endl;
    std::cout << *Set.rbegin() << std::endl;
 
    //rend() function return Iterator that point next to last data(reverse)
    std::cout << std::endl << "rend()" << std::endl;
    std::cout << *(--Set.rend()) << std::endl;
 
    //size() function return value that set's size
    std::cout << std::endl << "size()" << std::endl;
    std::cout << Set.size() << std::endl;
 
    //x1.swap(x2) function Swap x1 and x2 
    std::cout << std::endl << "swap() " << std::endl;
    std::cout << " Previous Set --> "; print(Set);
    std::cout << " Previous Set_Copy --> "; print(Set_Copy);
    Set.swap(Set_Copy); 
    std::cout << " After Set --> "; print(Set);
    std::cout << " After Set_Copy --> "; print(Set_Copy);
    
    //lower_bound(x) function return Iterator that point minimum value bigger than x(or point equal)
    std::cout << std::endl << "lower_bound(8) " << std::endl;
    std::set<int>::iterator Iter_lb;
    Iter_lb = Set_Copy.lower_bound(8);
    std::cout << "lower_bound(8) ---> " << *Iter_lb << std::endl;
    
    //upper_bound(x) function return Iterator that point minimum value bigger than x(not equal)
    std::cout << std::endl << "upper_bound(8) " << std::endl;
    std::set<int>::iterator Iter_ub;
    Iter_ub = Set_Copy.upper_bound(8);
    std::cout << "upper_bound(8) ---> " << *Iter_ub << std::endl;
    
    //equal_range(x) function return pair, first is Set.lower_bound(), second is upper_bound(x)
    std::cout << std::endl << "equal_range(x) " << std::endl;
    std::pair<std::set<int>::iterator, std::set<int>::iterator> Pair = Set_Copy.equal_range(8);
    std::cout << "first = lower_bound() --> " << *Pair.first << std::endl;
    std::cout << "second = upper_bound() --> " << *Pair.second << std::endl;
    
    //if to compare sort [y,z) and x is same ,x.value_comp(y,z) returns true
    std::set<int>::value_compare Value = Set.value_comp();
    std::cout << std::endl << "value_comp(y,z) " << std::endl;
    if (Value(34))
        std::cout << "Same" << std::endl;
    else
        std::cout << "Not Same" << std::endl;
 
    //if to compare sort [y,z) and x is same ,x.key_comp(y,z) returns true
    std::set<int>::key_compare Key=Set.key_comp();
    std::cout << std::endl << "key_comp(y,z) " << std::endl;
    if(Key(43))
        std::cout << "Same" << std::endl;
    else
        std::cout << "Not Same" << std::endl;
    
}
 
 
cs


각 함수들의 기능에 대해 알아보겠습니다.


    1. insert(x)

          셋 안에 데이터를 집어 넣습니다. 넣는 즉시 내림차순으로 정렬되게 됩니다.

    2. begin()

          셋 안에 첫 데이터(가장 작은 값)을 가리키는 이러레이터를 리턴합니다.

    3. cbegin()

          셋 안에 첫 데이터(가장 작은 값)을 가리키는 const 이터레이터를 리턴합니다.

    4. cend()

          셋 안에 가장 마지막 데이터 바로 다음을 가리키는 const 이터레이터를 리턴합니다.

    5. Operator '='

          x=y일때 셋 y에 있는 값들을 셋 x로 옮기고 x의 기존 값들은 삭제합니다.

    6. clear()

          셋 안에 들어있는 모든 데이터를 삭제합니다.

    7. count(x)

          셋 안에 있는 x의 갯수를 리턴합니다.

    8. crbegin()

          거꾸로 본 셋에서 가장 마지막에 있는 데이터 바로 다음을 가리키는 const 이터레이터를 리턴합니다.

    9. crend()

          거꾸로 본 셋에서 가장 마지막에 있는 데이터 바로 다음을 가리키는 이터레이터를 리턴합니다.

    10. emplace(x)

          셋 안에 x를 대입합니다.

    11. emplace_hint(x,y)

          셋안에 y값을 이터레이터 x가 가리키는 위치에 삽입합니다.

    12. empty()

          셋이 비었을 경우 true를 셋이 비지 않았을 경우엔 false를 리턴합니다.

    13. end()

          셋의 가장 마지막 바로 다음을 가리키는 이터레이터를 리턴합니다.

    14. erase()

      셋의 데이터를 삭제합니다.

    15. find()

      셋에서 데이터를 찾습니다.

    16. max_size()

          셋의 최대 사이즈를 리턴합니다.

    17. rbegin()

          거꾸로 본 셋의 가장 처음을 가리키는 이터레이터를 리턴합니다.

    18. rend()

          거꾸로 본 셋의 가장 마지막 바로 다음을 가리키는 이터레이터를 리턴합니다.

    19. size()

          셋의 사이즈를 리턴합니다.

    20. swap()

          x.swap(y) 셋 x와 셋 y의 내용을 이름빼고 완전히 바꾸어줍니다.

    21. lower_bound(x)

          셋 내에서 x보다 큰 최소값(동일 값 포함)을 가리키는 이터레이터를 리턴합니다.

    22. upper_bound(x)

          셋 내에서 x보다 큰 최소값(동일 값 제외)을 가리키는 이터레이터를 리턴합니다.

    23. equal_range(x)

          셋 내에서 lower_bound(x)를 가리키는 이터레이터를 first로 하고 upper_bound(x)를 가리키는 이더레이터는 second로 하는 pair를 리턴합
          니다.

    24. value_comp()

          (위 소스 참조) Value(x,y) 의 x와 y 이 정렬된 순서 등이 현재의 셋과 같은지 비교하여 같다면 true를 아니라면 false를 리턴합니다. 위의 
          소스의 경우에는 a b 같은경우는 오름차순을 나타내고 b a 는 내림차순을 나타냅니다.

    25. key_comp()

          (위 소스 참조) Value(x,y) 의 x와 y 이 정렬된 순서 등이 현재의 셋과 같은지 비교하여 같다면 true를 아니라면 false를 리턴합니다. 위의 
          소스의 경우에는 a b 같은경우는 오름차순을 나타내고 b a 는 내림차순을 나타냅니다.