map与vector排序

问题来源: PAT1095 B组

map容器不可以直接使用sort,要么仅对key排序,即构建cmp函数;要么将其包装到vector容器中,构造cmp函数可以同时对两个值进行排序(同时排序不代表可以拆分每个pair的对应关系)

map有key和value两个可作比较的数值

这篇文章也不错:

特别讲述了为什么vector要使用pair模板来接受map,以及pair的first,second与其重载的运算符<

vector和map可以这样嵌套吗?-CSDN社区

(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自定义排序

弱序与严格弱序:(8条消息) 弱序关系(weak ordering)和严格弱序关系(strict weak ordering)_nameofcsdn的博客-CSDN博客https://blog.csdn.net/nameofcsdn/article/details/104828188

目前俺的水平做不到仅使用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;

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值