问题来源: PAT1095 B组
map容器不可以直接使用sort,要么仅对key排序,即构建cmp函数;要么将其包装到vector容器中,构造cmp函数可以同时对两个值进行排序(同时排序不代表可以拆分每个pair的对应关系)
map有key和value两个可作比较的数值
这篇文章也不错:
特别讲述了为什么vector要使用pair模板来接受map,以及pair的first,second与其重载的运算符<
(8条消息) 老卫带你学---C++中map与pair的区别_老卫带你学-CSDN博客_pair和map的区别
map是Pair[n] pair是Pair[i]
即一个是容器,一个是容器内元素,二者的联系可以通过insert函数
map<string,int> m;
pair<string,int> p={"aaa",1};
m.insert(p);
(8条消息) C++ STL中Map的按Key排序和按Value排序_IIcyZhao's Road-CSDN博客_c++ map 排序
map中的元素是pair类型对象,每个pair类型由关键字—值(key-value)组成:关键字起到索引的作用,值则表示与索引相关联的数据。字典是一个很好的map例子,可以将单词作为关键字,将单词释义作为值。
map使用的底层数据结构为一颗红黑树(红黑树是一颗高度平衡二叉排序树),因为map的各种操作接口,RB-Tree也都提供了,所以几乎所有的map操作行为,都只是转调用了RB-Tree的操作行为而已。TB-Tree中的key是按弱序排序的,因此map中的key也是按弱序排列的,所以任意更改map的key会严重破坏map组织的,也就是key不能修改(key也就不能使用sort排序。)
————————————————
版权声明:本文为CSDN博主「algsup」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:(8条消息) C++:map自定义排序_algsup-CSDN博客_map自定义排序
目前俺的水平做不到仅使用map容器同时对key和value进行排序
这种同时排序的操作归纳在按value值排序下面,即使用value值排序方法
1.map关于key排序
(1) map函数两个模板: greater less
(2) 自定义函数: 用map的key排序时,就必须在定义一个map类型对象的时候,指定一个有严格弱序或强序的Compare类
//自定义map的key排列顺序
map<string,int,greater<string>> m1;
struct myCompare {
bool operator()(const string& l, const string& r)const
{
return l.length() > r.length();
}
};
map<string,int,myCompare> m2;
注意:使用vector容器包装,如果不自定义cmp函数,那么sort函数默认排序是key值
问题来源: LeetCode 506相对名次
class Solution {
public:
vector<string> findRelativeRanks(vector<int>& score) {
string medal[3]={"Gold Medal","Silver Medal","Bronze Medal"};
int n=score.size();
vector<pair<int,int>> s(n);
int i=0;
//map容器不能排序,使用vector<map>形式即可 也作:vector<pair>
for(auto it=score.begin();it!=score.end();it++){
//这里的插入很有文章:
//对于vector容器,其key值即value值,不可以简单赋值
//E0135
//这里如果赋值后直接sort会变默认升序,导致输出结果顺序偏差
//改进方法:
//1.sort函数增加cmp
//2.小技巧:将其key赋值为负数
s[i].first=-*it;
s[i].second=i;
//arr.push_back(make_pair(-score[i], i));
i++;
}
//pair类型的sort排序默认应该为first区域
sort(s.begin(),s.end());
vector<string> ans(n);
for(int j=0;j<n;j++){
if(j>=3){
ans[s[j].second]=to_string(j+1);
}
else{
ans[s[j].second]=medal[j];
}
}
return ans;
}
};
E1035 no member named ‘first‘_jianglx3的博客-CSDN博客
2.map关于value排序
如何实现Map的按Value排序呢?
第一反应是利用stl中提供的sort算法实现,这个想法是好的,不幸的是,sort算法有个限制,利用sort算法只能对线性容器进行排序(如vector,list,deque)。map是一个集合容器,它里面存储的元素是pair,不是线性存储的(前面提过,像红黑树),所以利用sort不能直接和map结合进行排序。
迂回一下,把map中的元素放到序列容器(如vector)中,然后再对这些元素进行排序。要对序列容器中的元素进行排序,也有个必要条件:就是容器中的元素必须是可比较的,也就是实现了<操作的。
map是元素为pair,其已实现<操作符的重载(最后一句是指: map的value和key值本身是可比较的吗?)
————————————————
版权声明:本文为CSDN博主「algsup」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_43152052/article/details/101039853
下面的代码段是: 利用map容器转化为vector容器后,对value进行排序,同时对key排序的方法
bool compare(const pair<string, int>& a, const pair<string, int>& b) {
if (a.second == b.second) {
return a.first < a.first;
}
else return a.second > b.second;
}
map<string,int> m{{"a",1},{"b",2},{"c",2}};
vector<pair<string,int>> v(m.begin(),m.end());//将map中的元素拷贝到vector中
sort(v.begin(),v.end(),compare);//实现value的排序
错误尝试: (key值双排)
即开篇红字的初次试探,无法通过在map声明处添加cmp,让其自动排序
即无法通过key值排序方式进行双排
struct myCompare {
//重载小于号似乎会报错
bool operator()(const pair<string, int>& a, const pair<string, int>& b)const
{
if (a.second == b.second) {
return a.first < a.first;
}
else return a.second > b.second;
}
};
map<string, int,myCompare> c3;