STL之map中排序方式的重载
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中排序方式的重载相关推荐
- Java的中排序方式
实体类: public class Person {public String getCode() {return code;}public void setCode(String code) {th ...
- Java8高效遍历map_Java8中Map的遍历方式总结
在这篇文章中,我将对Map的遍历方式做一个对比和总结,将分别从JAVA8之前和JAVA8做一个遍历方式的对比,亲测可行. public class LambdaMap { private Map ma ...
- java中的几种泛型类——HashSet、HashMap、TreeSet、TreeMap,遍历map,排序,HashTable比较
HashSet HashSet<E>泛型类在数据组织上类似于数学上的集合,可以进行"交"."并"."差"等运算. HashSet ...
- Java8-2-Lambda表达式实战-一句话实现Map中按照Value排序
在上一讲中, 我们着重的讲了表达式的一些基础知识和基本的使用, 今天我们来实战一把, 对Map的Value值排序进行简化. 在以前的思路我们的做法如下: /*** * Map根据value排序;* * ...
- Java集合或Map中元素排序及过滤
在Java中,对集合或Map中元素进行排序或过滤是一个频繁操作.这里以List为例介绍下如何在集合中实现元素的排序和过滤功能.对于非List元素(Set.Map)等,一方面可以参考List使用类似的方 ...
- Hive中的四种排序方式(order by,sort by,distribute by,cluster by)使用与区别详解
在平时的Hive数仓开发工作中经常会用到排序,而Hive中支持的排序方式有四种,这里结合具体的案例详细介绍一下他们的使用与区别: order by sort by distribute by clus ...
- C#中DictionaryTKey,TValue排序方式
自定义类: using System; using System.Collections.Generic; using System.Linq; using System.Text; using Sy ...
- java中list里面存放map,根据map中的某一个字段进行排序
Java中list里面存放map,根据map中的某一个字段进行排序 例如: [java] view plaincopy package com; import java.util.ArrayList; ...
- C++ STL容器 map禁止自动排序
背景:key-value形式的数据,已经使用了map存储,后来要求读取时的顺序要和插入的顺序一致 方案一.再定义个数组,按顺序保存key (推荐) 方案二.map更换为unordered_ma ...
最新文章
- 程序员的成长过程 | 每日趣闻
- 【Cocosd2d实例教程五】Cocos2d添加虚拟摇杆控制器
- iOS学习 NSString常用技巧
- hasLayout和filter滤镜的细节
- 各大EMM厂商功能比较 第一部分 MDM比较
- 虚拟机技术抗黑产!几维安全KiwiVM虚拟机实现全平台全架构防护方案!
- c语言谭浩强第七章例题
- 环境配置《安装gcc编译器》
- DRP:分销链上的精灵(转)
- win10突然不能使用usb大容量存储设备(移动硬盘)的解决方法
- 配置管理口管理曙光服务器
- 局域网传文件_iPhone与安卓跨系统「隔空投送」,传大文件超好用
- 解决warnings potentially fixable with the `--fix`
- PHP写json文件的树形菜单,树形菜单(无级树)json数据
- 钢琴家软件里曲谱的数据为什么更新不了_王者荣耀安卓与IOS互通?IOS恐怕得到不少利益,不然这事成不了...
- 从制造中来到智造中去
- php经常致命错误怎么办,如何捕获PHP中的致命错误(Fatal Errors)
- overleaf表格_Overleaf——LaTeX制表命令使用教程
- 似然函数 极大似然估计 本质讲解
- 数据库系统分析师考试大纲
热门文章
- 八一学院计算机无纸化考试成绩查询,会从考试成绩查询入口
- elasticsearch 7.8.0 kibana 7.8.0安装部署
- 肝!用 Python 加密文件
- 推荐一个Python终身学习者
- 【资源】分享1套最适合Py开发的机器学习/大数据视频课程
- foreach判断最后一个_PHP 内核:foreach 是如何工作的(二)
- 初中 昆虫记思维导图_初中物理各单元思维导图,帮孩子扫清初中所有物理知识点!(附电子版)...
- 双针模型:验证括号,特殊case处理
- idea使用dababase tools时导出db2建表语句,索引显示错误
- neutron plugin 笔记