set은 search, removal, insertion을 logn time complexity로수행 가능하다.
set을 사용할때 custom한 함수를 넣어서 비교를 할 수있다.
다만 중복 되면 입력이 잘 안된다.
따라서 중복이 되는 데이터를 다룰 때는 multiset을 사용하도록 하자
그리고 클래스를 넣을 수도 있는데 꼭 비교 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
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
|
#include <iostream>
#include <set>
#include <utility>
#include <string>
struct customFn
{
bool operator() (const int lhs, const int rhs) const
{
//return lhs > rhs;
return (lhs % 10) < (rhs % 10);
}
};
class Cat
{
public:
Cat (int age, std::string name) : mAge{ age }, mName{ std::move(name) } {};
void speak() const
{
std::cout << mAge << mName << std::endl;
};
int age() const
{
return mAge;
}
const std::string& name() const
{
return mName;
}
private:
int mAge;
std::string mName;
};
bool operator< (const Cat& lhs, const Cat& rhs)
{
return lhs.age() < rhs.age();
}
// search, removal, insertion log n time complexity
// red black tree 사용
// find -> o(logn)
// insertion -> o(logn) (tree balancing and recoloring)
// deletion -> o(logn)
// set은 중복 제거 기능 있음, 정렬 되어 나옴
// multiset -> 중복 허용, unordered_set -> HashTable 사용
int main(int argc, char const* argv[])
{
//std::set<int> nums{ 1,2,3,4,5,5,6,1 };
// 비교 함수를 넣을 수 있음
std::set<int, customFn> nums{ 1,2,3,4,5 };
customFn customfn;
std::cout << customfn(1,2) << std::endl;
// Cat 클래스 추가하기
// Comparison을 정의하지 않는다면 에러가 발생한다
std::set<Cat> cats;
cats.emplace(1, "nabi");
cats.emplace(2, "kitty");
cats.emplace(1, "woonggon"); //<- 나이 중복으로 emplace 불가
for (const auto& cat : cats) {
cat.speak();
}
std::cout << std::endl;
nums.emplace(11);
nums.emplace(21);
nums.emplace(101); // 나머지가 1, 중복되어서 set에 추가되지 않음(조심하자)
nums.emplace(5);
nums.emplace(5);
nums.emplace(5);
nums.emplace(5);
nums.emplace(5);
nums.emplace(3);
nums.emplace(2);
nums.emplace(6);
nums.emplace(-1);
nums.emplace(100);
nums.emplace(-500);
for (const int num : nums)
{
std::cout << num << " ";
}
std::cout << std::endl;
// Multiset은 중복을 지원한다.
std::multiset<int> nums_multiset{ 1,2,3,3,3,4,5 };
for (const auto& num : nums_multiset)
{
std::cout << num << " ";
}
std::cout << std::endl;
}
|
'C' 카테고리의 다른 글
c++ unordered_set 사용 기록 (0) | 2021.06.27 |
---|---|
c++ map 사용 방법 (0) | 2021.06.27 |
c++ stl deque 설명, 성능상 이슈 (0) | 2021.06.27 |
c++ vector, array 다차원 배열, 2d array를 1d처럼, 성능 주의점 (0) | 2021.06.27 |
c++ vector sort, stable_sort, partial_sort, nth_element, minmax, find, accumulate 코드 (0) | 2021.06.27 |