c++中map排序
来源:互联网 发布:mp3剪切合并软件 编辑:程序博客网 时间:2024/06/08 13:23
首先,得说明,在c++中有两个关联容器,第一种是map,内部是按照key排序的,第二种是unordered_map,容器内部是无序的,使用hash组织内容的。
对有序map中的key排序
如果在有序的map中,key是int,或者string,它们天然就能比较大小,本身的就是有序的。不用额外的操作。如果map中的key是自定义类型呢?
#include<iostream>#include <stdio.h>#include<string> #include<map> using namespace::std;typedef pair<string, int> PAIR;struct CmpByKeyLength {bool operator()(const string& k1, const string& k2) {return k1.length() < k2.length();}};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->first << "\t" << iter->second<<endl;}getchar();}
按照上面的代码其实是运行不了的。
报下面的错误
error C3848: 具有类型“const CmpByKeyLength”的表达式会丢失一些 const-volatile 限定符以调用“bool CmpByKeyLength::operator ()(const std::string &,const std::string &)”
CmpByKeyLength里面得加上const!
具体的说,代码如下:
struct CmpByKeyLength {bool operator()(const string& k1, const string& k2) const {return k1.length() < k2.length();}};
上面的代码是按照key的长度排序,这个知道了,那对key进行任何操作就都OK的。
对无序的map按照value排序
#include<iostream>#include <stdio.h>#include<string> #include<unordered_map>#include <algorithm>using namespace::std;typedef pair<string, int> PAIR;struct CmpByValue {bool operator()(const PAIR& k1, const PAIR& k2)const {return k1.second > k2.second;}};int main() { unordered_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));//遍历hash tablefor(const auto& iter:name_score_map)cout << iter.first << "\t" << iter.second << endl;cout << 'abc' << endl;vector<PAIR> name_score_vec(name_score_map.begin(), name_score_map.end());sort(name_score_vec.begin(), name_score_vec.end(), CmpByValue());for (int i = 0; i != name_score_vec.size(); ++i) {cout << name_score_vec[i].first << "\t" << name_score_vec[i].second<<endl;}getchar();}对value排序还有更简单的方法
int main(){ unordered_map<int, int> iMap; iMap[1] = 20; iMap[2] = 10; iMap[5] = 30; iMap[4] = 0; vector<pair<int, int>> vtMap; for (auto it = iMap.begin(); it != iMap.end(); it++) vtMap.push_back(make_pair(it->first, it->second)); sort(vtMap.begin(), vtMap.end(), [](const pair<int, int> &x, const pair<int, int> &y) -> int { return x.second < y.second; }); for (auto it = vtMap.begin(); it != vtMap.end(); it++) cout << it->first << ':' << it->second << '\n'; return 0;}
参考资料
http://blog.csdn.net/acidgl8757/article/details/17416439http://blog.csdn.net/theonegis/article/details/48549887
阅读全文
0 0
- C++中map的排序问题
- java中map排序
- Java中Map排序
- Map中数据排序
- java中map排序
- c++中map排序
- 【C++】map根据value排序
- c++中map的排序
- Java中Map的排序
- C++STL中,map/multimap,set/multiset 和vector的排序
- C++map如何按值排序
- js中map中元素排序
- .NET 中禁止map自动排序
- STL中map按值(value)排序
- STL中map按值(value)排序
- java对map中value的排序
- STL中map按值排序
- Map中按value值排序
- 关于github和sourcetree的ssh密钥配置教程
- iOS 计算UILable显示文字所需要的行数
- Tensorflow dynamic_rnn_decoder()
- Java 通过反射原理取得entity的值
- UIBezierPath画曲线控制点的选取
- c++中map排序
- oracle initialization or shutdown in progress解决方法
- centos7.3下二进制安装mysql5.7.19记录
- BZOJ1022: [SHOI2008]小约翰的游戏John
- Python基础小笔记《2017-10-18》
- java面试题-java虚拟机(JVM)
- c++ string和其他类型互转
- tomcat对https配置
- [BZOJ1076]奖励关-状压+期望