본문 바로가기

C

c++ vector sort, stable_sort, partial_sort, nth_element, minmax, find, accumulate 코드

c++ vector, sort, stable_sort, minmax, find, accumulate 코드

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
#include <iostream>
#include <vector>
#include <array>
#include <algorithm>
#include <numeric>
 
struct Employee
{
    int age;
    std::string name;
};
 
bool operator<(const Employee& lhs, const Employee& rhs)
{
    return lhs.age < rhs.age;
};
 
void fnArray()
{
    std::array<int100> nums;
}
 
void fnVector()
{
    std::vector<int> nums;
    nums.resize(100000);
}
 
int main()
{
    //std::array<int, 100> nums;
    std::vector<int> nums{ 1,3,6,8,129,38,3,6,8 };
    // sort
    // lambda 함수도 넣을 수 있음
    std::sort(nums.begin(), nums.end());
    for (auto num : nums)
    {
        std::cout << num << " ";
    }
    std::cout << std::endl;
    //stable_sort
    //기준대로 sort는 되지만, 그 이외의 것들은 그대로이다.
    std::vector<Employee> v =
    {
        {108"Zaphod"},
        {32"Arthur"},
        {108"Ford"}
    };
 
    std::stable_sort(v.begin(), v.end());
 
    for (const Employee& e : v)
        std::cout << e.age << ", " << e.name << '\n';
 
    std::cout << std::endl;
    
    //partial_sort
    //부분(top-5)만 sort함
 
    std::array<int10> s{ 5,7,4,2,8,6,1,9,0,3 };
    std::partial_sort(s.begin(), s.begin() + 3, s.end());
    for (int a : s) {
        std::cout << a << " ";
    }
    std::cout << std::endl;
    
 
    // 가운데 숫자를 기준으로 정렬한다
    std::vector<int> t{ 5,6,4,3,2,6,7,9,3 };
    std::nth_element(t.begin(), t.begin() + t.size() / 2, t.end());
    std::cout << "The median is " << t[t.size() / 2<< '\n';
    for (int a : t) {
        std::cout << a << " ";
    }; 
 
    std::cout << std::endl;
    // Min값과 Max값
    std::vector<int> minv{ 3,1,4,1,5,9 };
    std::vector<int>::iterator min_result = std::min_element(minv.begin(), minv.end());
    std::vector<int>::iterator max_result = std::max_element(minv.begin(), minv.end());
    std::cout << "min element at : " << std::distance(minv.begin(), min_result) << std::endl;
    std::cout << "max element at : " << std::distance(minv.begin(), max_result) << std::endl;
 
    // Min Max를 한번에 구한다
 
    // vector find하기
    const std::vector<int> nums1{ 0,1,2,3,4 };
    const auto resultItr = std::find(nums1.begin(), nums1.end(), 2);
    const auto resultItr_nolist = std::find(nums1.begin(), nums1.end(), 10);
 
 
    if (resultItr != nums1.end())
    {
        std::cout << "idx: " << std::distance(nums1.begin(), resultItr) << std::endl;
    }
    else
    {
        std::cout << "no elem found!" << std::endl;
    }
 
    if (resultItr_nolist != nums1.end())
    {
        std::cout << "idx: " << std::distance(nums1.begin(), resultItr_nolist) << std::endl;
    }
    else
    {
        std::cout << "no elem found!" << std::endl;
    }
 
 
    // accumulate 은 single core (#include <numeric> 필요)
    // reduce는 multiple core (#include <numeric> 필요)
    std::vector<int> nums2{ 1,2,3,4,5,6,7,8,9,10 };
    int sum = std::accumulate(nums2.begin(), nums2.end(), 0);
    int product = std::accumulate(nums2.begin(), nums2.end(), 1std::multiplies<int>());
 
    std::cout << "sum: " << sum << '\n'
        << "product: " << product << "\n";
    
    return 0;
}