본문 바로가기
프로그래밍

STL vector sort(벡터 정렬) (2)

by _BlankSpace 2017. 4. 8.

고민은 하고 오셨나요? 혹은.. 바로 아셨을 지도 모르겠습니다.


그럼 바로 본론으로 들어가겠습니다.


#include <functional> ///< 이 헤더파일은 greater를 사용하기 위해 필요합니다.


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
#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>
 
using namespace std;
 
int main()
{
    vector<int> a;
    int b = 0;
 
    for (int i = 0; i < 5; i++) {
        cin >> b;
        a.push_back(b);
    }   
    sort(a.begin(), a.end());
        
    for (int i = 0; i < 5; i++) {
        cout << a[i] << endl;
    }
 
    sort(a.begin(), a.end(), greater<int>());
        
    for (int i = 0; i < 5; i++) {
        cout << a[i] << endl;
    }
 
    return 0;
}
 
 
cs


이 전 포스트와는 다르게 23줄의 sort 형태가 달라진 것을 보실 수 있을 것입니다.


sort함수의 3번째 인자에는 특수한 형태의 함수를 넣으면 그에 따른 정렬을 할 수 있습니다.


이것은 int형 뿐만 아니라 객체의 비교도 가능하도록 하는 강력한 기능이 될 수 있습니다.!


아래의 예는 소스의 일부를 가져온 것입니다. 다음의 소스 코드로 설명하겠습니다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
bool sorting(const uint8 direction)
{
    if (direction == SORT_DIRECTION_FORWARD) {
        sort(_logList.begin(), _logList.end(), LogManager::ascComp);
    }
    else if (direction == SORT_DIRECTION_BACKWARD) {
        sort(_logList.begin(), _logList.end(), LogManager::descComp);
    }
}
 
bool ascComp(const Log* log1, const Log* log2) {
    return (log1->number() < log2->number());
}
 
bool descComp(const Log* log1, const Log* log2) {
    return (log1->number() > log2->number());
}
 
cs


11 ~ 17 줄은 용도에 따라서 새롭게 정의한 비교 함수라고 생각하시면 될 것입니다.


number()라는 함수는 log객체의 멤버변수인 number를 가져오는 get 함수라고 생각하시면 됩니다.


따라서 새롭게 정의한 함수는 두 log의 객체를 비교하여, bool 값을 리턴하는 형식으로 이루어져 있습니다.


이러한 방식을 사용한다면, 기본 데이터 형뿐만 아니라 객체끼리도 비교하여, 객체가 들어있는 벡터도 


비교할 수 있습니다. 


여러분도 한번 응용해서 사용해보세요! 쉬운 sort 기능이니까요!


그럼 다음에 봐요~


'프로그래밍' 카테고리의 다른 글

[c++ 정복하자] 목차  (0) 2017.05.13
[STL] Vector 정리  (0) 2017.04.14
STL vector sort(벡터 정렬) (1)  (1) 2017.04.08
STL Vector정리(1)  (0) 2017.04.08
mutable 키워드  (0) 2017.03.25

댓글