본문 바로가기

Language Proficiency/C++

std::sort 함수

컨테이너 안에 있는 데이터를 정렬할 때 일반적으로 std::sort()를 사용한다. 특히, 숫자형 데이터를 백터에 넣어놓은 상태에서 정렬하는 경우 아주 쉽게 사용할 수 있다. std::sort의 기본 정렬은 오름차순으로 정렬이 되는데, 오름차순과 내림차순 정렬에 대해 간단히 기록해둔다.


1
2
3
// 오름차순 정렬
std::vector<int> vNumbers;
std::sort(vNumbers.begin(), vNumbers.end());




오름차순 정렬은 위와 같이 간단하게 컨테이너의 시작과 끝을 지정해주면 그 사이의 값이 오름차순으로 정렬이 된다.

그러면 내림차순 정렬은 어떻게 해야 할까?


1
2
std::sort(vNumbers.begin(), vNumbers.end());
std::reverse(vNumbers.begin(), vNumbers.end());


너무나 당연한 얘기지만, 오름차순 정렬 후 역으로 뒤집어 놓으면 내림차순이 된다.



1
2
3
// 내림차순 정렬 #1
std::vector<int> vNumbers;
std::sort(vNumbers.rbegin(), vNumbers.rend());



다른 간단한 방법은 컨테이너의 시작과 끝을 reverse iterator로 지정해주는 것이다.



1
2
3
// 내림차순 정렬 #2
std::vector<int> vNumbers;
std::sort(vNumbers.begin(), vNumbers.end(), std::greater<int>());



reverse iterator를 사용하지 않고, 세번째 인자를 주어 처리할 수 있다.



1
2
3
// 내림차순 정렬 #3
std::vector<int> vNumbers;
std::sort(vNumbers.begin(), vNumbers.end(), [](const int a, const int b) {return a > b; })



람다식을 이용해서 처리할 수도 있다.



위에서 보여준 간단한 숫자의 정렬에서 다른 영문 데이터를 추가하여 정렬, 즉 숫자를 오름차순으로 정렬하되 같은 숫자이면 같은 영문이면 영문 순서로 정렬되도록 구현하는 것은 어떻게 할까?


예를 들어


1
2
3
4
5
6
struct Player {
   std::string sName;
   int iScore;
};
 
std::vector<Player> vPlayers;



라는 형태의 데이터가 있을 때 다음과 같이 정렬을 하면 된다.


1
2
3
std::sort(vPlayers.begin(), vPlayers.end(), [](Player& A, Player& B) {
 return (A.iScore == B.iScore && A.sName < B.sName) || (A.iScore > B.iScore);
});