C++ STL中Map的按Value排序
2024-08-25 04:04:26
那么我们如何实现对pair按value进行比较呢? 第一种:是最原始的方法,写一个比较函数; 第二种:刚才用到了,写一个函数对象。这两种方式实现起来都比较简单。
- 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;
- }
- };
接下来,我们看下sort算法,是不是也像map一样,可以让我们自己指定元素间如何进行比较呢?
- template <class RandomAccessIterator>
- void sort ( RandomAccessIterator first, RandomAccessIterator last );
- template <class RandomAccessIterator, class Compare>
- void sort ( RandomAccessIterator first, RandomAccessIterator last, Compare comp );
我们看到,令人兴奋的是,sort算法和map一样,也可以让我们指定元素间如何进行比较,即指定Compare。需要注意的是,map是在定义时指定的,所以传参的时候直接传入函数对象的类名,就像指定key和value时指定的类型名一样;sort算法是在调用时指定的,需要传入一个对象,当然这个也简单,类名()就会调用构造函数生成对象。
这里也可以传入一个函数指针,就是把上面说的第一种方法的函数名传过来。(应该是存在函数指针到函数对象的转换,或者两者调用形式上是一致的,具体确切原因还不明白,希望知道的朋友给讲下,先谢谢了。)
【参考代码】
- 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] << endl;
- }
- return 0;
- }
【运行结果】
- #include <iostream>
- #include <cstdlib>
- #include <map>
- #include <vector>
- #include <string>
- #include <algorithm>
- using namespace std;
- int cmp(const pair<string, int>& x, const pair<string, int>& y)
- {
- return x.second > y.second;
- }
- void sortMapByValue(map<string, int>& tMap,vector<pair<string, int> >& tVector)
- {
- for (map<string, int>::iterator curr = tMap.begin(); curr != tMap.end(); curr++)
- tVector.push_back(make_pair(curr->first, curr->second));
- sort(tVector.begin(), tVector.end(), cmp);
- }
- int main()
- {
- map<string, int> tMap;
- string word;
- while (cin >> word)
- {
- pair<map<string,int>::iterator,bool> ret = tMap.insert(make_pair(word, 1));
- if (!ret.second)
- ++ret.first->second;
- }
- vector<pair<string,int>> tVector;
- sortMapByValue(tMap,tVector);
- for(int i=0;i<tVector.size();i++)
- cout<<tVector[i].first<<": "<<tVector[i].second<<endl;
- system("pause");
- return 0;
- }
最新文章
- 优化Android Studio/Gradle构建
- sql的列的说明
- Java读写文件通用格式
- 11-10 CC150第一章
- WPF学习笔记——认识XAML
- Create Custom Modal Dialog Windows For User Input In Oracle Forms
- 《C和指针》读书笔记 第5章-操作符和表达式
- Android桌面悬浮清内存app概述
- 《VIM-Adventures攻略》前言
- Libcurl安装及编译
- 新秀系列C/C++经典问题(四)
- 10分钟精通SharePoint - SharePoint拓扑结构
- iOS工程师常用的命令行命令总结
- mac ox下android 通过battery-historian进行电量分析
- [扩展推荐] —— Laravel Log 增强
- linux下oracle启动关闭
- P2P互联网金融企业的四大转型方向
- CentOS7中启动Chrome报错ERROR:zygote_host_impl_linux.cc
- centos7内核升级及curl访问https证书过期处理
- 20172311『Java程序设计』课程 结对编程练习_四则运算第二周阶段总结
热门文章
- TarjanLCA学习笔记
- Flask实战第48天:首页轮播图实现
- ABP+NetCore+Vue.js实现增删改查
- 【BZOJ 3669】 3669: [Noi2014]魔法森林 (动态spfa)
- 【UOJ #198】【CTSC 2016】时空旅行
- 【图论】Network of Schools
- Codeforces 804D Expected diameter of a tree(树形DP+期望)
- CentOS 6.9下iptables通过raw表实现日志输出和调试
- .Net 2014 Connect() 相关文章合集
- 花间美人:古风 CG插画技法