1. map中的数据默认是按key值字典序排
    栗子:

    #include <iostream>
    #include <map>
    using namespace std;
    //typedef pair<char,int>PAIR;
    int main()
    {map<char,int>mp;mp.insert(make_pair('b',1));//插入数据方式1mp['a'] = 2;//插入数据方式2mp.insert(make_pair('A',3));for(map<char,int>::iterator it = mp.begin(); it!=mp.end(); it++){cout<<it->first<<" "<<it->second<<endl;}return 0;
    }
    

运行结果:

#include <iostream>
#include <string.h>
#include <map>
using namespace std;
int main()
{map<string,int>mp;mp.insert(make_pair("bab",1));mp["abb"] = 2;mp.insert(make_pair("Adfd",3));mp["baaa"] = 4;mp["gfgggh"] = 5;for(map<string,int>::iterator it = mp.begin(); it!=mp.end(); it++){cout<<it->first<<" "<<it->second<<endl;}return 0;
}


但是现在如果key值为一个很大的数字(要用字符串表示),我们希望让它按数字从小到到排序,不对map重载能行吗?
下面先来看个题目:
题目背景
宇宙总统竞选

题目描述
地球历公元6036年,全宇宙准备竞选一个最贤能的人当总统,共有n个非凡拔尖的人竞选总统,现在票数已经统计完毕,请你算出谁能够当上总统。

输入输出格式
输入格式:
president.in

第一行为一个整数n,代表竞选总统的人数。

接下来有n行,分别为第一个候选人到第n个候选人的票数。

输出格式:
president.out

共两行,第一行是一个整数m,为当上总统的人的号数。

第二行是当上总统的人的选票。

输入输出样例
输入样例#1:

5
98765
12365
87954
1022356
985678

输出样例#1:

4
1022356

说明
票数可能会很大,可能会到100位数字。

n<=20
这个题目我想用map来做
不重载行吗?
WA code:

#include <iostream>
#include <map>
#include <string.h>
using namespace std;
map<string,int>mp;
int main()
{int n;cin>>n;string s;for(int i = 1; i <= n; i++){cin>>s;mp[s] = i;}map<string,int>::iterator it = mp.begin();cout<<it->second<<'\n'<<it->first<<endl;return 0;
}

样例测试结果:

上面这份代码样例是能过的,但是看下面这组数据:

7
6791385765449865851630484098561093867193
6791385765405861305476138956183659819548
6791385765448765481033867082657092835470
6791385765476183659186548165418634013875
6791385765413054861086540816508058173710
6365470813654816508136547081654108365108
36571811836547138541

测试结果却是不正确的:


可以看出,不作重载无法达到我们的目标(key值为一个很长的数字串,让它从小到大排序(或从大到小))。
一开始用map没重载来做上那个问题,WA。原因是我误认为字典序可以将一个很长的数字串从小到大来排序。
那么我想让map来实现大数从小到大(或从大到小)排序该怎么办?当然就是对key进行重载了。
对key重载前需要先了解一下STL中map的模板:

template < class Key, class T, class Compare = less<Key>,  class Allocator = allocator<pair<const Key,T> > > class map;

class Compare=less可以看出map这里指定less作为其默认比较函数(对象)
所以重载比较函数

#include <iostream>
#include <map>
#include <string>
using namespace std;
typedef pair<string,int>PAIR;
ostream& operator<<(ostream& out,const PAIR& p){//重载输出流return out<<p.second<<'\n'<<p.first;
}
struct cmp{//重载map的key值排序方式bool operator()(const string& x,const string& y){if(x.length()==y.length())//一样长的话,字符串比较,大的数更大return x > y;return x.length()>y.length();//更长的数字更大}
};
map<string,int,cmp>mp;
int main()
{int n;cin>>n;string s;for(int i = 1; i <= n; i++){cin>>s;mp.insert(make_pair(s,i));//map[s] = i;}map<string,int,cmp>::iterator it = mp.begin();cout<<*it<<endl;return 0;
}

运行结果:

2. 如果想让`map按value值排序怎么办?
比如用map实现,想让学生的按成绩升序排
直接上代码:

#include <bits/stdc++.h>
using namespace std;
typedef pair<string,int> PAIR;
//比较函数(重载方式一)
bool cmp_by_value(const PAIR& lhs, const PAIR& rhs) {return lhs.second < rhs.second;
}
/*
//函数对象(重载方式二)
struct CmpByValue {bool operator()(const PAIR& lhs, const PAIR& rhs) {return lhs.second < rhs.second;}
};
*/
int main() {map<string, int> name_score_map;name_score_map["LiMin"] = 90;name_score_map["ZiLinMi"] = 79;name_score_map["BoB"] = 92;name_score_map.insert(make_pair("Bing",99));name_score_map.insert(make_pair("Albert",86));//把map中元素转存到vector中vector<PAIR> name_score_vec(name_score_map.begin(), name_score_map.end());//sort(name_score_vec.begin(), name_score_vec.end(), CmpByValue());sort(name_score_vec.begin(), name_score_vec.end(), cmp_by_value);for (int i = 0; i < name_score_vec.size(); ++i) {cout << name_score_vec[i].first<<' '<<name_score_vec[i].second << endl;}return 0;
}

运行结果:

更详细的请参考博客:
https://blog.csdn.net/iicy266/article/details/11906189

STL之map中排序方式的重载相关推荐

  1. Java的中排序方式

    实体类: public class Person {public String getCode() {return code;}public void setCode(String code) {th ...

  2. Java8高效遍历map_Java8中Map的遍历方式总结

    在这篇文章中,我将对Map的遍历方式做一个对比和总结,将分别从JAVA8之前和JAVA8做一个遍历方式的对比,亲测可行. public class LambdaMap { private Map ma ...

  3. java中的几种泛型类——HashSet、HashMap、TreeSet、TreeMap,遍历map,排序,HashTable比较

    HashSet HashSet<E>泛型类在数据组织上类似于数学上的集合,可以进行"交"."并"."差"等运算. HashSet ...

  4. Java8-2-Lambda表达式实战-一句话实现Map中按照Value排序

    在上一讲中, 我们着重的讲了表达式的一些基础知识和基本的使用, 今天我们来实战一把, 对Map的Value值排序进行简化. 在以前的思路我们的做法如下: /*** * Map根据value排序;* * ...

  5. Java集合或Map中元素排序及过滤

    在Java中,对集合或Map中元素进行排序或过滤是一个频繁操作.这里以List为例介绍下如何在集合中实现元素的排序和过滤功能.对于非List元素(Set.Map)等,一方面可以参考List使用类似的方 ...

  6. Hive中的四种排序方式(order by,sort by,distribute by,cluster by)使用与区别详解

    在平时的Hive数仓开发工作中经常会用到排序,而Hive中支持的排序方式有四种,这里结合具体的案例详细介绍一下他们的使用与区别: order by sort by distribute by clus ...

  7. C#中DictionaryTKey,TValue排序方式

    自定义类: using System; using System.Collections.Generic; using System.Linq; using System.Text; using Sy ...

  8. java中list里面存放map,根据map中的某一个字段进行排序

    Java中list里面存放map,根据map中的某一个字段进行排序 例如: [java] view plaincopy package com; import java.util.ArrayList; ...

  9. C++ STL容器 map禁止自动排序

    背景:key-value形式的数据,已经使用了map存储,后来要求读取时的顺序要和插入的顺序一致   方案一.再定义个数组,按顺序保存key (推荐)   方案二.map更换为unordered_ma ...

最新文章

  1. 程序员的成长过程 | 每日趣闻
  2. 【Cocosd2d实例教程五】Cocos2d添加虚拟摇杆控制器
  3. iOS学习 NSString常用技巧
  4. hasLayout和filter滤镜的细节
  5. 各大EMM厂商功能比较 第一部分 MDM比较
  6. 虚拟机技术抗黑产!几维安全KiwiVM虚拟机实现全平台全架构防护方案!
  7. c语言谭浩强第七章例题
  8. 环境配置《安装gcc编译器》
  9. DRP:分销链上的精灵(转)
  10. win10突然不能使用usb大容量存储设备(移动硬盘)的解决方法
  11. 配置管理口管理曙光服务器
  12. 局域网传文件_iPhone与安卓跨系统「隔空投送」,传大文件超好用
  13. 解决warnings potentially fixable with the `--fix`
  14. PHP写json文件的树形菜单,树形菜单(无级树)json数据
  15. 钢琴家软件里曲谱的数据为什么更新不了_王者荣耀安卓与IOS互通?IOS恐怕得到不少利益,不然这事成不了...
  16. 从制造中来到智造中去
  17. php经常致命错误怎么办,如何捕获PHP中的致命错误(Fatal Errors)
  18. overleaf表格_Overleaf——LaTeX制表命令使用教程
  19. 似然函数 极大似然估计 本质讲解
  20. 数据库系统分析师考试大纲

热门文章

  1. 八一学院计算机无纸化考试成绩查询,会从考试成绩查询入口
  2. elasticsearch 7.8.0 kibana 7.8.0安装部署
  3. 肝!用 Python 加密文件
  4. 推荐一个Python终身学习者
  5. 【资源】分享1套最适合Py开发的机器学习/大数据视频课程
  6. foreach判断最后一个_PHP 内核:foreach 是如何工作的(二)
  7. 初中 昆虫记思维导图_初中物理各单元思维导图,帮孩子扫清初中所有物理知识点!(附电子版)...
  8. 双针模型:验证括号,特殊case处理
  9. idea使用dababase tools时导出db2建表语句,索引显示错误
  10. neutron plugin 笔记