C++ STL中Map的按Key排序
为了实现快速查找,map内部本身就是按序存储的(比如红黑树)。在我们插入<key, value>键值对时,就会按照key的大小顺序进行存储。这也是作为key的类型必须能够进行<运算比较的原因。现在我们用string类型作为key,因此,我们的存储就是按学生姓名的字典排序储存的。
【参考代码】
- #include<map>
- #include<string>
- #include<iostream>
- using namespace std;
- typedef pair<string, int> PAIR;
- ostream& operator<<(ostream& out, const PAIR& p) {
- return out << p.first << "\t" << p.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));
- for (map<string, int>::iterator iter = name_score_map.begin();
- iter != name_score_map.end();
- ++iter) {
- cout << *iter << endl; //因为重定义了输出<<操作符,否则用cout << iter->first << " => " << iter->second << '\n';
- }
- return 0;
- }
【运行结果】

大家都知道map是stl里面的一个模板类,现在我们来看下map的定义:
- template < class Key, class T, class Compare = less<Key>,
- class Allocator = allocator<pair<const Key,T> > > class map;
它有四个参数,其中我们比较熟悉的有两个: Key 和 Value。第四个是 Allocator,用来定义存储分配模型的,此处我们不作介绍。
现在我们重点看下第三个参数: class Compare = less<Key>
这也是一个class类型的,而且提供了默认值 less<Key>。 less是stl里面的一个函数对象,那么什么是函数对象呢?
所谓的函数对象:即调用操作符的类,其对象常称为函数对象(function object),它们是行为类似函数的对象。表现出一个函数的特征,就是通过“对象名+(参数列表)”的方式使用一个 类,其实质是对operator()操作符的重载。
现在我们来看一下less的实现:
- template <class T> struct less : binary_function <T,T,bool> {
- bool operator() (const T& x, const T& y) const
- {return x<y;}
- };
它是一个带模板的struct,里面仅仅对()运算符进行了重载,实现很简单,但用起来很方便,这就是函数对象的优点所在。stl中还为四则运算等常见运算定义了这样的函数对象,与less相对的还有greater:
- template <class T> struct greater : binary_function <T,T,bool> {
- bool operator() (const T& x, const T& y) const
- {return x>y;}
- };
map这里指定less作为其默认比较函数(对象),所以我们通常如果不自己指定Compare,map中键值对就会按照Key的less顺序进行组织存储,因此我们就看到了上面代码输出结果是按照学生姓名的字典顺序输出的,即string的less序列。
我们可以在定义map的时候,指定它的第三个参数Compare,比如我们把默认的less指定为greater:
【参考代码】
- #include<map>
- #include<string>
- #include<iostream>
- using namespace std;
- typedef pair<string, int> PAIR;
- ostream& operator<<(ostream& out, const PAIR& p) {
- return out << p.first << "\t" << p.second;
- }
- int main() {
- map<string, int, greater<string> > 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));
- for (map<string, int>::iterator iter = name_score_map.begin();
- iter != name_score_map.end();
- ++iter) {
- cout << *iter << endl;
- }
- return 0;
- }
【运行结果】

现在知道如何为map指定Compare类了,如果我们想自己写一个compare的类,让map按照我们想要的顺序来存储,比如,按照学生姓名的长短排序进行存储,那该怎么做呢?
其实很简单,只要我们自己写一个函数对象,实现想要的逻辑,定义map的时候把Compare指定为我们自己编写的这个就ok啦。
- struct CmpByKeyLength {
- bool operator()(const string& k1, const string& k2) {
- return k1.length() < k2.length();
- }
- };
是不是很简单!这里我们不用把它定义为模板,直接指定它的参数为string类型就可以了。
【参考代码】
- int main() {
- map<string, int, CmpByKeyLength> 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));
- for (map<string, int>::iterator iter = name_score_map.begin();
- iter != name_score_map.end();
- ++iter) {
- cout << *iter << endl;
- }
- return 0;
- }
【运行结果】

C++ STL中Map的按Key排序的更多相关文章
- C++ STL中Map的按Key排序和按Value排序
map是用来存放<key, value>键值对的数据结构,可以很方便快速的根据key查到相应的value.假如存储学生和其成绩(假定不存在重名,当然可以对重名加以区 分),我们用map来进 ...
- C++ STL中Map的按Key排序跟按Value排序
C++ STL中Map的按Key排序和按Value排序 map是用来存放<key, value>键值对的数据结构,可以很方便快速的根据key查到相应的value.假如存储学生和其成绩(假定 ...
- C++ STL中Map的按Value排序
那么我们如何实现对pair按value进行比较呢? 第一种:是最原始的方法,写一个比较函数: 第二种:刚才用到了,写一个函数对象.这两种方式实现起来都比较简单. typedef pair<st ...
- C++ STL中Map的相关排序操作:按Key排序和按Value排序 - 编程小径 - 博客频道 - CSDN.NET
C++ STL中Map的相关排序操作:按Key排序和按Value排序 - 编程小径 - 博客频道 - CSDN.NET C++ STL中Map的相关排序操作:按Key排序和按Value排序 分类: C ...
- C++中的STL中map用法详解(转)
原文地址: https://www.cnblogs.com/fnlingnzb-learner/p/5833051.html C++中的STL中map用法详解 Map是STL的一个关联容器,它提供 ...
- C++ STL 中 map 容器
C++ STL 中 map 容器 Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据 处理能力,由于这个特性,它 ...
- STL中map的使用
知识点 C++中map提供的是一种键值对容器,里面的数据都是成对出现的.map内部自建一颗红黑树(一种非严格意义上的平衡二叉树),这颗树具有对数据自动排序的功能,所以在map内部所有的数据都是有序的. ...
- STL中map与hash_map的比较
1. map : C++的STL中map是使用树来做查找算法; 时间复杂度:O(log2N) 2. hash_map : 使用hash表来排列配对,hash表是使用关键字来计算表位置; 时间复杂度:O ...
- STL中map与hash_map容器的选择收藏
这篇文章来自我今天碰到的一个问题,一个朋友问我使用map和hash_map的效率问题,虽然我也了解一些,但是我不敢直接告诉朋友,因为我怕我说错了,通过我查询一些帖子,我这里做一个总结!内容分别来自al ...
随机推荐
- 洛谷P3539 [POI2012] ROZ-Fibonacci Representation
题目传送门 转载自:five20,转载请注明出处 本来看到这题,蒟蒻是真心没有把握的,还是five20大佬巨orz 首先由于斐波拉契数的前两项是1,1 ,所以易得对于任何整数必能写成多个斐波拉契数加减 ...
- Mysql远程连接报错:SQL Error (1130): Host '192.168.6.128' is not allowed to connect to this MySQL server
通过SQLyog连接linux中的MySQL报错问题:SQL Error (1130): Host '192.168.6.128' is not allowed to connect to this ...
- Idea集成svn
Idea集成svn 既然要使用svn,首先需要下载一个 svn的客户端,到这里下载对应的安装程序:http://subversion.apache.org/packages.html#windows ...
- File I/O知识点
问题1:File类的作用? 解答:File 类用于访问文件或目录的属性.File类位于java.io包中. 问题2:流?及流的分类? 解答:流是指一连串流动的字符,是以先进先出的方式发送信息的通道.程 ...
- UVA 10163 - Storage Keepers(dp)
本文出自 http://blog.csdn.net/shuangde800 题目链接: 点击打开链接 题意 有n个仓库,让m个人来看管.一个仓库只能由一个人来看管,一个人可以看管多个仓库. 每个人 ...
- php-scandir()报错
l linux下 vim /usr/local/php/etc/php.in l 直接斜杠找 /disable_functions 回车 l 按i键 l ...
- 利用cURL请外部接口
昨天有一个需求,就是需要把获取到的百度地图信息存储到百度地图LBS云储存上 看了一下LBS云储存,说白了就是通过接口操作云数据库,所以写了一个通用的cURL函数 代码如下: /** * @param ...
- linux UART串口驱动开发文档
转:http://www.360doc.com/content/10/0417/18/829197_23519037.shtml linux UART串口驱动开发文档时间:2010-01-09 14: ...
- BlackBerry10 开发环境搭建
最近开始学习BlackBerry10的开发,黑莓10系统是2013年1月30日黑莓公司正式发布的,目前网上资料比较少,这篇博客的内容基本上是按照官网上的文档写的.BlackBerry10目前支持C/C ...
- 实现同时提交多个form(基础方法) 收集
实现同时提交多个form(基础方法) 收集 分类: 1.2-JSP 1.3-J2EE 1.1J2se 1.0-Java相关2011-12-01 20:59 1644人阅读 评论(0) 收藏 举报 bu ...