那么我们如何实现对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. }

最新文章

  1. 优化Android Studio/Gradle构建
  2. sql的列的说明
  3. Java读写文件通用格式
  4. 11-10 CC150第一章
  5. WPF学习笔记——认识XAML
  6. Create Custom Modal Dialog Windows For User Input In Oracle Forms
  7. 《C和指针》读书笔记 第5章-操作符和表达式
  8. Android桌面悬浮清内存app概述
  9. 《VIM-Adventures攻略》前言
  10. Libcurl安装及编译
  11. 新秀系列C/C++经典问题(四)
  12. 10分钟精通SharePoint - SharePoint拓扑结构
  13. iOS工程师常用的命令行命令总结
  14. mac ox下android 通过battery-historian进行电量分析
  15. [扩展推荐] —— Laravel Log 增强
  16. linux下oracle启动关闭
  17. P2P互联网金融企业的四大转型方向
  18. CentOS7中启动Chrome报错ERROR:zygote_host_impl_linux.cc
  19. centos7内核升级及curl访问https证书过期处理
  20. 20172311『Java程序设计』课程 结对编程练习_四则运算第二周阶段总结

热门文章

  1. TarjanLCA学习笔记
  2. Flask实战第48天:首页轮播图实现
  3. ABP+NetCore+Vue.js实现增删改查
  4. 【BZOJ 3669】 3669: [Noi2014]魔法森林 (动态spfa)
  5. 【UOJ #198】【CTSC 2016】时空旅行
  6. 【图论】Network of Schools
  7. Codeforces 804D Expected diameter of a tree(树形DP+期望)
  8. CentOS 6.9下iptables通过raw表实现日志输出和调试
  9. .Net 2014 Connect() 相关文章合集
  10. 花间美人:古风 CG插画技法