unordered_map的排序

unordered_map 的排序

unordered_map是C++的哈希表结构, unorded_map并不能直接排序, 如果要排序,一般来说需要将unordered_map转换为vector再通过自定义排序函数使用sort进行排序。

实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
bool cmp(pair<char, int>& a, pair<char,int>& b) {
return a.second > b.second; // 按照second降序
}

void sort_unordered_map() {
unordered_map<char, int> mp;

int idx = 1;
for(char c = 'a'; c <= 'z'; c++) {
mp[c] = idx++;
}

// 利用vector构造函数快速转换
vector<pair<char, int>> sorted_mp(mp.begin(), mp.end());

sort(sorted_mp.begin(), sorted_mp.end(), cmp);

// 此时可以选择直接使用排序后的vector或者再转换为哈希表
for(auto [a, b] : sorted_mp) {
cout << a << "" << b << endl;
}
}

关于sort函数:

默认函数有两种,第一个参数和第二个参数都是容器的起始地址和结束地址,第三个参数是排序函数,接受范围内的两个元素作为参数并返回可转换为布尔值的二元函数。返回的值表示作为第一个参数传递的元素是否被视为在其定义的特定严格弱排序中位于第二个参数之前。

template <class RandomAccessIterator> void sort (RandomAccessIterator first, RandomAccessIterator last);
template <class RandomAccessIterator, class Compare> void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp);

sort对于不同类型的默认排序:

对数组排序: 默认从小到大排序

pair排序,默认对first从小到大排序,first相同是对second从小到大排序

对结构体: 一般需要自定义函数