작성
·
904
0
#include<iostream>
#include<map>
#include<unordered_map>
using namespace std;
map<string, int> m1;
unordered_map<string, int> m2;
int main(){
m1["3rd"] = 1;
m1["2nd"] = 2;
m1["1st"] = 3;
for(auto e : m1){
cout << e.first << ":" << e.second << "\n";
}
m2["3rd"] = 1;
m2["2nd"] = 2;
m2["1st"] = 3;
for(auto e : m2){
cout << e.first << ":" << e.second << "\n";
}
return 0;
}
위 코드의 결과는 아래와 같습니다.
//map
1st:3
2nd:2
3rd:1
//unordered_map
1st:3
2nd:2
3rd:1
Q1. unordered_map의 경우 셋팅한 순서대로 출력될 것을 예상했지만 key를 기준으로 정렬된 순서대로 출력을 하고 있습니다. 제가 잘 이해를 못하고 unordered_map을 사용하고 있는 건가요?
Q2. map(unordered_map)에 추가한 여러 entry(key-value)들을 정렬조건에 맞게 출력하는 방법이 궁금합니다.
vector는 algorithm헤더의 sort함수에 커스텀cmp함수를 넣는 방식으로 잘 이해하고 있습니다.
답변 1
0
안녕하세요. ㅎㅎ
map의 경우 key를 아스키코드순으로 오름차순으로 정렬합니다.
C++ map구현체를 보면 다음과 같습니다.
template < class Key, // map::key_type
class T, // map::mapped_type
class Compare = less<Key>, // map::key_compare
class Alloc = allocator<pair<const Key,T> > // map::allocator_type
> class map;
여기서 "less<Key>"는 키를 기반으로 오름차순 정렬을 의미합니다.
참고로 이를 내림차순 정렬로 바꾸고 싶다면 다음과 같이 "greater<Key>"을 쓰면 됩니다.
#include <bits/stdc++.h>
using namespace std;
map<string, int,greater<string>> mp;
int main(){
mp["a"] = 1;
mp["b"] = 1;
mp["c"] = 1;
for(auto it : mp){
cout << it.first << " : " << it.second << '\n';
}
return 0;
}
정렬되지 않습니다. 해당 부분 교안에 추가로 해서 업데이트 하겠습니다.
#include<bits/stdc++.h>
using namespace std;
unordered_map<string, int> umap;
int main(){
umap["bcd"] = 1;
umap["aaa"] = 1;
umap["aba"] = 1;
for(auto it : umap){
cout << it.first << " : " << it.second << '\n';
}
}
/*
정렬이 되지 않는다.
aba : 1
aaa : 1
bcd : 1
*/
정렬 방법에 대한 답변 감사합니다.
추가로, unordered_map 은 정렬을 따로 하지 않는 자료구조라고 교안에 나와있으나
질문드린 내용처럼 정렬된 결과를 출력하는 것 처럼 보입니다. 이런 현상이 나타나는 이유도 궁금합니다.