본문 바로가기

C

c++ set, multiset, 커스텀 비교 함수, 커스텀 클래스

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;
 
    
}