No Rules Rules
STL map 내맘대로 sort (feat. c++, map, pair, value) 본문
STL map을 value 기준으로 sort
자료구조 map은 key값으로 정렬되어집니다.
map의 원형을 보시면 다음과 같습니다.
정렬과 관련되어 주의깊게 보셔야 할점은 class _Pr = less<_Kty> 입니다.
기본적으로 map<int> 라는 자료형 선언시, Predicate의 default 인자는 less<int>가 됩니다.
그래서 오름차순으로 자동 정렬이 되는 것이구요.
만약 내림차순의 map을 사용하고 싶다면 greater<_Kty>로 설정하면 된다는 것이죠.
물론 오름차순도 내림차순도 아닌 특수한 정렬을 갖는 map을 생성하고 싶다면 직접 정의할 수도 있습니다.
하지만 원형에서 보듯이 _Kty 즉, key 로만 정렬되어질 수 있습니다.
따라서 key가 아닌 value로 정렬을 하고 싶다면 자료형을 선언하는 시점에는 할 수 없고, 정렬이 필요한 시점에 무언가를 해주어야 합니다.
map을 vector로 변환
map은 vector로 변환할 수 있습니다.
map의 key와 value를 pair 형태를 갖는 vector로 변경할 수 있습니다.
#include <map>
#include <vector>
#include <algorithm>
map<int, double> data1;
...
vector<pair<int, double>> data2(map.begin(), map.end());
위와 같이 자료구조 map에 담긴 데이터를 자료구조 vector로 치환할 수 있습니다.
하지만 vector는 pair를 담고 여기서 value는 double입니다.
만약 pair의 second인 double로 오름차순을 하고, 만약 같다면 first인 int로 내림차순을 하고 싶다고 가정해봅시다.
#include <map>
#include <vector>
#include <algorithm>
bool cmp(const pair<int, double>& v1, const pair<int, double>& v2){
if(v1.second == v2.second)
return v1.first > v2.first;
return v1.second < v2.second;
}
map<int, double> data1;
...
vector<pair<int, double>> data2(map.begin(), map.end());
sort(data2.begin(), data2.end(), cmp); // second로 오름차순(같다면 first로 내림차순)
정렬하고 싶은 기준이 있다면 그에 따라 Predicate 역할을 하는 함수를 정의하고 sort의 predicate 인자에 삽입하면 되겠습니다.
'언어 > STL' 카테고리의 다른 글
STL chrono (feat. c++, time_since_epoch, system_clock, nanoseconds) (0) | 2022.07.20 |
---|---|
STL tuple (feat. c++, make_tuple, tuple_size, tuple_cat) (0) | 2022.07.20 |
STL pair (feat. c++, make_pair) (0) | 2022.07.20 |
STL이란? (feat. Modern C++) (0) | 2022.07.20 |