컨테이너 안에 있는 데이터를 정렬할 때 일반적으로 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); }); |
'Language Proficiency > C++' 카테고리의 다른 글
Variable Sized Arrays (0) | 2018.07.31 |
---|---|
간단한 String 변수 다루기(Trim, 중복제거 등) (0) | 2018.07.27 |
std::chrono의 time_point를 문자열로 변환하기 (0) | 2018.07.27 |
날짜시간(YYYYMMDDHHMMSS) 문자열을 chrono의 time_point로 변환하기 (0) | 2018.07.27 |
std::thread의 thread_id를 문자 변환 (0) | 2018.07.27 |