C++ STL 对Map容器进行排序 您所在的位置:网站首页 如何进行数据排名并按顺序排列 C++ STL 对Map容器进行排序

C++ STL 对Map容器进行排序

2024-07-11 18:46| 来源: 网络整理| 查看: 265

map是用来存放键值对的数据结构,可以很方便快速的根据key查到相应的value。假如存储学生和其成绩(假定不存在重名,当然可以对重名加以区分),我们用map来进行存储就是个不错的选择。 我们这样定义,map,其中学生姓名用string类型,作为Key;该学生的成绩用int类型,作为value。这样一来,我们可以根据学生姓名快速的查找到他的成绩。

但是,我们除了希望能够查询某个学生的成绩,或许还想看看整体的情况。我们想把所有同学和他相应的成绩都输出来,并且按照我们想要的顺序进行输出:比如按照学生姓名的顺序进行输出,或者按照学生成绩的高低进行输出。换句话说,我们希望能够对map进行按Key排序或按Value排序,然后按序输出其键值对的内容。

一、C++ STL中Map的按Key排序

其实,为了实现快速查找,map内部本身就是按序存储的(比如红黑树)。在我们插入键值对时,就会按照key的大小顺序进行存储。这也是作为key的类型必须能够进行 map 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::iterator iter = name_score_map.begin(); iter != name_score_map.end(); ++iter) { cout return xreturn x>y;} };

map这里指定less作为其默认比较函数(对象),所以我们通常如果不自己指定Compare,map中键值对就会按照Key的less顺序进行组织存储,因此我们就看到了上面代码输出结果是按照学生姓名的字典顺序输出的,即string的less序列。

我们可以在定义map的时候,指定它的第三个参数Compare,比如我们把默认的less指定为greater:

【参考代码】

#include #include #include #include using namespace std; typedef pair PAIR; ostream& operator map 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::iterator iter = name_score_map.begin(); iter != name_score_map.end(); ++iter) { cout return k1.length() bool operator()(const string& k1, const string& k2) const { return k1.length() cout } pair(const T1& x, const T2& y) : first(x), second(y) {} template pair (const pair &p) : first(p.first), second(p.second) { } }

pair也是一个类模板,这样就实现了良好的通用性。它仅有两个数据成员first 和 second,即 key 和 value,而且

在头文件中,还为pair重载了 < 运算符, 具体实现如下:

template inline bool operator= __y.first 成立,在这个条件下,我们来分析下 !(__y.first < __x.first) && __x.second < __y.second

!(__y.first < __x.first) ,看清楚,这里是y的key不小于x的key ,结合前提条件,__x.first < __y.first 不成立,即x的key不小于y的key

即: !(__y.first < __x.first) && !(__x.first < __y.first ) 等价于 __x.first == __y.first ,也就是说,第二种情况是在key相等的情况下,比较两者的value(second)。

这里比较令人费解的地方就是,为什么不直接写 __x.first == __y.first 呢? 这么写看似费解,但其实也不无道理:前面讲过,作为map的key必须实现 return lhs.second return lhs.second return lhs.second return lhs.second cout



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有