在使用multimap的过程中发现有时我们需要对相同key值的value进行排序,但经过查阅文档后发现,multimap所提供的大小比较器只针对键值,而对于value的大小比较无能为力,对于插入的相同key值的pair只会让他们以插入的顺序保存。
这里将提供前人和我自己对于此类需求的一些见解。
第一种:将multimap中的值压入vector<pair>,再使用sort函数自定义比较排序,实际上这种比较方式十分冗余,失去了multimap的使用必要,不如直接将pair插入vector进行排序。
时间复杂度:n*logn~n^2 空间复杂度n+n
第二种:使用双multimap进行排序
int main()
{
vector<vector<int>>v = { {1,2},{1,1}, {5,6},{3,9},{6,10},{3,5},{1,6},{1,5} };
multimap<int, int>test_map_NOs;
for (auto i : v)
{
test_map_NOs.insert(make_pair(i[0], i[1]));
}
//排序的对比
multimap<int, int> test_map_s;
for (auto i : v)
{
test_map_s.insert(make_pair(i[1],i[0]));
}
multimap<int, int> sort_map;
for (auto e : test_map_s)
{
sort_map.insert(make_pair(e.second, e.first));
}
return 0;
}
可以发现,经过两个容器互换,可以排序value。但使用此方式请注意:需要先将value作为key插入中间体multimap,在将value作为value插入回排序好的multimap。
即:先排序value顺序再插入
时间复杂度:n*logn空间复杂度:n+n
第三种:
直接使用multiset<pair<int,int>,Mycmp>作为容器,其中Mycmp为排序的仿函数。
可以将空间复杂度降为n。
但以上方式均感觉属于冗余方式,可能multimap可以直接进行此种排序,但是目前并未查到,若有更好的方法请在评论区交流