No Rules Rules

STL map 내맘대로 sort (feat. c++, map, pair, value) 본문

언어/STL

STL map 내맘대로 sort (feat. c++, map, pair, value)

개발하는 완두콩 2022. 9. 21. 15:45
728x90
반응형

STL map을 value 기준으로 sort

자료구조 map은 key값으로 정렬되어집니다.

map의 원형을 보시면 다음과 같습니다.

 

STL에서 제공되는 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 인자에 삽입하면 되겠습니다.

728x90
반응형
Comments