본문 바로가기
기타

[C++] STL pair를 sort 함수로 내림차순 정렬하기

by 햄과함께 2019. 5. 31.
320x100

sort 함수를 알고리즘 문제를 풀다가 정렬할 때 마다 쓰는데

내림차순을 원하거나 second 값으로 오름차순을 하길 원할 때 compare 함수를 어떻게 짜야하는지 맨날 헷갈린다.  

​그래서 포스팅해둠.

 

sort 함수는 algorithm 헤더파일을 필요로 한다.

 

sort(시작 주소, 종료 주소, [비교함수]) 

비교함수는 생략이 가능하다.

생략시에는 오름차순으로 정렬된다.

sort 함수

compare 함수대신

greater<int>(), less(int>() 들도 사용한다고 하는데 아직 한 번도 안 써봤다...

 

이 때,

sort(&arr[0], &arr[N], compare);

이렇게 써주어도 된다.

정렬되는 범위가 시작 주소는 포함하고 종료 주소는 포함이 되지 않는다고 한다.

즉, 위 함수 정렬의 범위는 arr[0], arr[1], ... ,arr[9] 가 된다. arr[10]은 정렬 범위에 포함되지 않는다.

 

비교 함수

first 값으로 내림차순 하되 만약 first 값이 같다면 second 값으로 내림차순 하게 만들어준다.  

비교함수는 순서가 올바른 경우는 true를, 올바르지 않는 경우는 false를 반환해준다. 

 

처음에 pair를 몇 개(N) 입력 받을 것인지 입력받고

N만큼 pair 쌍을 입력 받은 뒤

정렬한 결과를 출력하는 프로그램을 짜보았다.

 

실행 결과

전체 소스보기 : https://gist.github.com/fpdjsns/4ee81897968d864fe1928ac231ce8e94


참고로 처음엔 first 값으로 오름차순을 한 뒤 first 값이 크면 second값으로 오름차순을 하는 함수를 짰었는데

(그래서 미리보기 설명에 ascending order라고 적혀있음)

위 compare 함수로

 

sort(arr, arr+N, compare) 한 결과나

sor(arr, arr+N) 한 결과나

 

결과가 같게 나온다...

first 값이 같으면 second 값으로 오름차순 하는게 default로 되어있나..?

보아하니 pair를 사용한 경우에는 sort함수를 사용하는데 문제 없게 작동하나 보다.
 

sort(arr, arr+N) 실행 결과

제목은 pair를 sort함수로 내림차순 정렬하는 방법이지만

원리만 이해한다면 원하는 구조체 배열 같은 경우도 쉽게 정렬할 수 있다. 

 


+ vector 정렬

vector<int> v;
sort(v.begin(), v.end());
sort(v.begin(), v.end(), [](int& a, int& b){ return a > b; });
320x100

댓글