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