问题来源: 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;

map与vector排序相关推荐

  1. LeetCode 1311. 获取你好友已观看的视频(BFS+哈希map+vector排序)

    1. 题目 有 n 个人,每个人都有一个 0 到 n-1 的唯一 id . 给你数组 watchedVideos 和 friends ,其中 watchedVideos[i] 和 friends[i] ...

  2. Vector排序中遇到的坑(lambda表达式)

    在针对一个map进行值排序的时候,想到将map中键值对放到vector中,然后通过sort来进行排序.于是,奇妙的事情发生了..,代码如下: //将map赋值给vector vector<pai ...

  3. c语言map作为参数传递,C++中map和vector作形参时如何给定默认参数?

    map和vector都可以用operator[]进行访问,map是用[]中的数据作为key进行查询,而vector是用[]中的数作为下标进行访问. 如果在用operator[]进行访问的时候出现了越界 ...

  4. java map集合排序的_Java对Map集合进行排序

    Java对Map集合进行排序 实现 Comparator 接口,重写compare方法,完成自定义排序 int compare(Object o1, Object o2) 返回一个基本类型的整型 如果 ...

  5. java字符串字典排序_java实现对map的字典序排序操作示例

    本文实例讲述了java实现对map的字典序排序操作.分享给大家供大家参考,具体如下: java中对map的字典序排序,算法验证比对微信官网https://mp.weixin.qq.com/wiki?t ...

  6. Collections、Set、Map、斗地主排序

    Collections.Set.Map.斗地主排序 今日内容 Collections shuffle sort自然排序 比较器排序 可变参数[重] addall方法 Set接口 hashCode 哈希 ...

  7. 用sort对vector排序(转载)

    用sort对vector排序 #include<vector> #include<string> #include <iostream> #include < ...

  8. java map字典序_java中对map的字典序排序

    java中对map的字典序排序,算法验证比对微信官网https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115& ...

  9. C++ 二维vector排序(sort用法)

    C++二维vector排序 sort 函数的使用 sort 函数的使用 自定义排序函数 (目标:对 二维vector<vector> points中第二个元素进行排序) static bo ...

最新文章

  1. 1月书讯 | 开年多本重点书
  2. AI进军摇滚圈,老炮:这是啥?
  3. 已被管理员、加密政策或凭据存储停用
  4. 删除-Trustzone-TEE-ATF
  5. AWK命令进行字符串替换-图解两个例子(转)
  6. 内建模块_月隐学python第14课
  7. 吴恩达DeepLearningCourse4-卷积神经网络
  8. https跳转到http session丢失问题
  9. MakeGenericMethod Reflection 反射 ObjectToXmlT Generic XmlSerializer
  10. 初识Python 04 day
  11. Ubuntu下libmodbus的应用
  12. java毕业设计博雅楼自习室预约系统Mybatis+系统+数据库+调试部署
  13. Google zxing实现二维码扫描完美解决方案
  14. Excel技巧—如何快速批量删除空行
  15. ShardingSphere 5.2.1 发布|新增系统库、强制分片路由、一致性校验
  16. 第十六章 - 垃圾回收相关概念
  17. Java_取模/取余
  18. 低功耗读卡(RFID)电路与程序实现
  19. 一个永久免费的图片鉴黄api接口
  20. 2022年度回忆录我在 CSDN 的这一年

热门文章

  1. PlaySound函数
  2. 机房收费系统 概要设计
  3. python 中 True 和 False、逻辑运算符
  4. 《MFC编程》:MFC库中类的简介
  5. 如何用O(n)实现四等分数组
  6. 前端实习生应该掌握什么技能?
  7. 林大OJ习题 2020年1月11日
  8. 记一次web端读取串口数据(扫码枪)
  9. c语言n1.n2%,C语言题库填空.doc
  10. Matlab细胞识别统计,血液细胞的图像识别计数方法与流程