map和set容器如何使用value进行排序
为什么要这么做?
map的两个值分别为key值和value值,map是按照key值进行排序的,但有时候需要按照value值进行排序,并且按照value的顺序输出key值;
例如“: map是用来存放<key, value>键值对的数据结构,可以很方便快速的根据key查到相应的value。假如存储学生和其成绩(假定不存在重名,当然可以对重名加以区分),我们用map来进行存储就是个不错的选择。 我们这样定义,map<string, int>,其中学生姓名用string类型,作为Key;该学生的成绩用int类型,作为value。这样一来,我们可以根据学生姓名快速的查找到他的成绩。
但是,我们除了希望能够查询某个学生的成绩,或许还想看看整体的情况。我们想把所有同学和他相应的成绩都输出来,并且按照我们想要的顺序进行输出:比如按照学生姓名的顺序进行输出,或者按照学生成绩的高低进行输出。换句话说,我们希望能够对map进行按Key排序或按Value排序,然后按序输出其键值对的内容。
思路如下
现在我们想要从map中得到学生按成绩的从低到高的次序输出,该如何实现呢?换句话说,该如何实现Map的按Value排序呢?
如果利用stl中提供的sort算法实现,这个想法是好的,不幸的是,sort算法有个限制,利用sort算法只能对序列容器进行排序,就是线性的(如vector,list,deque)。map也是一个集合容器,它里面存储的元素是pair,但是它不是线性存储的(前面提过,像红黑树),所以利用sort不能直接和map结合进行排序。
换个思路,虽然不能直接用sort对map进行排序,那么我们可不可以迂回一下,把map中的元素放到序列容器(如vector)中,然后再对这些元素进行排序呢?这个想法看似是可行的。要对序列容器中的元素进行排序,也有个必要条件:就是容器中的元素必须是可比较的,也就是实现了用value进行排序的操作。
整体代码如下
class Solution {
private:
//使得value从大到小排列
static bool cmp1(const pair<int,int>&x,const pair<int,int>&y)
{
return x.second>y.second;
}
public:
vector<int> topKFrequent(vector<int>& nums, int k) {
//无序map容器储存可比较的值
unordered_map<int,int>mmap;
for(int i=0;i<nums.size();i++)
{
mmap[nums[i]]++;
}
//利用vector容器储存map容器的元素,用于排序
vector<pair<int,int>>tes;
for(auto it=mmap.begin();it!=mmap.end();it++)
{
tes.push_back(make_pair(it->first,it->second));
}
//对value进行排序
sort(tes.begin(),tes.end(),cmp1);
vector<int>res;
auto it=tes.begin();
//打印value信息
for(int i=res.size();k>0;k--)
{
res.push_back(it->first);
it++;
}
return res;
}
};