C ++ STL中的映射通常根据其键进行排序。但是在某些情况下,我们需要根据值对映射进行排序。在本文中,我们将讨论如何根据值而不是键对映射进行排序。
在详细介绍之前,让我们以一个示例问题来了解何时需要基于值而不是键进行排序。
一个非常普遍的问题是根据频率对数组或列表进行排序。我们在此处所做的操作将创建映射以存储频率。现在,根据键对映射进行排序,但是我们要求根据值对映射进行排序。那么我们能做什么?
我们可以使用优先级队列和自己的比较器功能对映射进行排序。在阅读本文之前,请仔细阅读我们有关如何在C ++ STL中为优先级队列定义比较器的文章。
映射的元素是什么?
假设映射是<T,T>,其中T可以是任何数据类型
。映射的每个元素都是对<T,T>
使用STL的优先级队列的语法:
priority_queue<T,vector<T>,decltype(comp)> pq(comp);
其中T是元素的通用类型,comp是比较器函数
因此,在map的情况下,它将是
priority_queue<pair<T,T>,vector< pair<T,T>>,decltype(comp)> pq(comp);
由于pair <T,T>是map元素
现在,我们可以根据需要的逻辑定义比较器功能。
现在开始讨论基于值排序的问题。如果两个键的值是基于键的相同排序。
假设映射是map <int,int> mymap。
Key value 1 6 2 8 6 3 9 8
检查下面的代码以查看详细的实现,并输出以查看已排序的映射。
#include <bits/stdc++.h> using namespace std; void sort_map_on_value(map<int, int> mymap) { //比较器lambda函数 auto comp = [](pair<int, int> a, pair<int, int> b) { //比较逻辑 //如果第一个元素的值大于 //无需交换 if (a.second > b.second) return false; //如果第一个元素的值小于 //需要交换 else if (a.second < b.second) return true; else { //当值相同时 if (a.first < b.first) { return false; } else return true; } }; priority_queue<pair<int, int>, vector<pair<int, int> >, decltype(comp)> pq(comp); for (auto& ij : mymap) { pq.push(ij); } //打印排序的映射 cout << "key value\n"; while (!pq.empty()) { cout << pq.top().first << " " << pq.top().second << endl; pq.pop(); } } void print(map<int, int> mymap) { cout << "key value\n"; for (auto & [ key, value ] : mymap) cout << key << " " << value << endl; } int main(){ map<int, int> mymap; mymap[1] = 6; mymap[2] = 8; mymap[6] = 3; mymap[8] = 2; cout << "before sorting map is:\n"; print(mymap); cout << "after sorting based on value map is: \n"; sort_map_on_value(mymap); return 0; }
输出:
before sorting map is: key value 1 6 2 8 6 3 8 2 after sorting based on value map is: key value 2 8 1 6 6 3 8 2