那么我们如何实现对pair按value进行比较呢? 第一种:是最原始的方法,写一个比较函数;  第二种:刚才用到了,写一个函数对象。这两种方式实现起来都比较简单。

  1. typedef pair<string, int> PAIR;
  2. bool cmp_by_value(const PAIR& lhs, const PAIR& rhs) {
  3. return lhs.second < rhs.second;
  4. }
  5. struct CmpByValue {
  6. bool operator()(const PAIR& lhs, const PAIR& rhs) {
  7. return lhs.second < rhs.second;
  8. }
  9. };

接下来,我们看下sort算法,是不是也像map一样,可以让我们自己指定元素间如何进行比较呢?

  1. template <class RandomAccessIterator>
  2. void sort ( RandomAccessIterator first, RandomAccessIterator last );
  3. template <class RandomAccessIterator, class Compare>
  4. void sort ( RandomAccessIterator first, RandomAccessIterator last, Compare comp );

我们看到,令人兴奋的是,sort算法和map一样,也可以让我们指定元素间如何进行比较,即指定Compare。需要注意的是,map是在定义时指定的,所以传参的时候直接传入函数对象的类名,就像指定key和value时指定的类型名一样;sort算法是在调用时指定的,需要传入一个对象,当然这个也简单,类名()就会调用构造函数生成对象。

这里也可以传入一个函数指针,就是把上面说的第一种方法的函数名传过来。(应该是存在函数指针到函数对象的转换,或者两者调用形式上是一致的,具体确切原因还不明白,希望知道的朋友给讲下,先谢谢了。)

【参考代码】

  1. int main() {
  2. map<string, int> name_score_map;
  3. name_score_map["LiMin"] = 90;
  4. name_score_map["ZiLinMi"] = 79;
  5. name_score_map["BoB"] = 92;
  6. name_score_map.insert(make_pair("Bing",99));
  7. name_score_map.insert(make_pair("Albert",86));
  8. //把map中元素转存到vector中
  9. vector<PAIR> name_score_vec(name_score_map.begin(), name_score_map.end());
  10. sort(name_score_vec.begin(), name_score_vec.end(), CmpByValue());
  11. // sort(name_score_vec.begin(), name_score_vec.end(), cmp_by_value);
  12. for (int i = 0; i != name_score_vec.size(); ++i) {
  13. cout << name_score_vec[i] << endl;
  14. }
  15. return 0;
  16. }

【运行结果】


  1. #include <iostream>
  2. #include <cstdlib>
  3. #include <map>
  4. #include <vector>
  5. #include <string>
  6. #include <algorithm>
  7. using namespace std;
  8. int cmp(const pair<string, int>& x, const pair<string, int>& y)
  9. {
  10. return x.second > y.second;
  11. }
  12. void sortMapByValue(map<string, int>& tMap,vector<pair<string, int> >& tVector)
  13. {
  14. for (map<string, int>::iterator curr = tMap.begin(); curr != tMap.end(); curr++)
  15. tVector.push_back(make_pair(curr->first, curr->second));
  16. sort(tVector.begin(), tVector.end(), cmp);
  17. }
  18. int main()
  19. {
  20. map<string, int> tMap;
  21. string word;
  22. while (cin >> word)
  23. {
  24. pair<map<string,int>::iterator,bool> ret = tMap.insert(make_pair(word, 1));
  25. if (!ret.second)
  26. ++ret.first->second;
  27. }
  28. vector<pair<string,int>> tVector;
  29. sortMapByValue(tMap,tVector);
  30. for(int i=0;i<tVector.size();i++)
  31. cout<<tVector[i].first<<": "<<tVector[i].second<<endl;
  32. system("pause");
  33. return 0;
  34. }

C++ STL中Map的按Value排序的更多相关文章

  1. C++ STL中Map的按Key排序和按Value排序

    map是用来存放<key, value>键值对的数据结构,可以很方便快速的根据key查到相应的value.假如存储学生和其成绩(假定不存在重名,当然可以对重名加以区 分),我们用map来进 ...

  2. C++ STL中Map的按Key排序跟按Value排序

    C++ STL中Map的按Key排序和按Value排序 map是用来存放<key, value>键值对的数据结构,可以很方便快速的根据key查到相应的value.假如存储学生和其成绩(假定 ...

  3. C++ STL中Map的按Key排序

    为了实现快速查找,map内部本身就是按序存储的(比如红黑树).在我们插入<key, value>键值对时,就会按照key的大小顺序进行存储.这也是作为key的类型必须能够进行<运算比 ...

  4. C++ STL中Map的相关排序操作:按Key排序和按Value排序 - 编程小径 - 博客频道 - CSDN.NET

    C++ STL中Map的相关排序操作:按Key排序和按Value排序 - 编程小径 - 博客频道 - CSDN.NET C++ STL中Map的相关排序操作:按Key排序和按Value排序 分类: C ...

  5. STL中map与hash_map的比较

    1. map : C++的STL中map是使用树来做查找算法; 时间复杂度:O(log2N) 2. hash_map : 使用hash表来排列配对,hash表是使用关键字来计算表位置; 时间复杂度:O ...

  6. C++中的STL中map用法详解(转)

    原文地址: https://www.cnblogs.com/fnlingnzb-learner/p/5833051.html C++中的STL中map用法详解   Map是STL的一个关联容器,它提供 ...

  7. C++ STL 中 map 容器

    C++ STL 中 map 容器 Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据 处理能力,由于这个特性,它 ...

  8. STL中map的使用

    知识点 C++中map提供的是一种键值对容器,里面的数据都是成对出现的.map内部自建一颗红黑树(一种非严格意义上的平衡二叉树),这颗树具有对数据自动排序的功能,所以在map内部所有的数据都是有序的. ...

  9. STL中map与hash_map容器的选择收藏

    这篇文章来自我今天碰到的一个问题,一个朋友问我使用map和hash_map的效率问题,虽然我也了解一些,但是我不敢直接告诉朋友,因为我怕我说错了,通过我查询一些帖子,我这里做一个总结!内容分别来自al ...

随机推荐

  1. Codeforces 714B. Filya and Homework

    题目链接:http://codeforces.com/problemset/problem/714/B 题意: 给你一个含有 n 个数的数组, 问你是否存在一个 x, 使得这个数组中的某些数加上 x, ...

  2. 简单说明CentOS源码安装程序

    第一步.安装依赖包.一般官网会有依赖关系,没有就网上搜索一下. 第二步.下载源码包,上传至CentOS服务器 第三步.解压缩 第四步.进入源码文件夹 第五步.执行./configure,这一步主要是为 ...

  3. Linux命令之chmod

    chmod [选项] … MODE[,MODE] … FILE … chmod [选项] … OCTAL-MODE FILE … chmod [选项] … --reference=RFILE FILE ...

  4. 高效的 itertools 模块(转)

    原文地址:http://python.jobbole.com/87380/ 我们知道,迭代器的特点是:惰性求值(Lazy evaluation),即只有当迭代至某个值时,它才会被计算,这个特点使得迭代 ...

  5. 【大视野入门OJ】1099:歌德巴赫猜想

    Description 歌德巴赫猜想大家都很熟悉吧?给一个数,能够分解成两个素数的和.现在要给你一个n,6 <= n < 1000000,让你求他会分解成哪两个素数?如果存在多组解,则要求 ...

  6. [BZOJ2159]Crash的文明世界(斯特林数+树形DP)

    题意:给定一棵树,求$S(i)=\sum_{j=1}^{n}dist(i,j)^k$.题解:根据斯特林数反演得到:$n^m=\sum_{i=0}^{n}C(n,i)\times i!\times S( ...

  7. Java并发(五):synchronized实现原理

    一.synchronized用法 Java中的同步块用synchronized标记. 同步块在Java中是同步在某个对象上(监视器对象). 所有同步在一个对象上的同步块在同时只能被一个线程进入并执行操 ...

  8. uva1632 (区间DP)

    题意:有n个宝藏,在x轴上,每个宝藏在某个时间会消失,问最少吃完所有宝藏的时间是多少,否则输出no solution 分析:区间DP,f[i][j][01]代表i到j区间内的全部吃完,停留在左/右端, ...

  9. React事件系统入门

    React基于虚拟DOM实现了一个合成事件层,我们所定义的事件处理器会接受到一个合成事件层对象的实例,它完全符合W3C标准,不会存在任何IE标准的兼容性问题.并且和原生的浏览器事件一样拥有同样的接口, ...

  10. Educational Codeforces Round 9 C. The Smallest String Concatenation 排序

    C. The Smallest String Concatenation 题目连接: http://www.codeforces.com/contest/632/problem/C Descripti ...