map
对map进行排序
首先一定要注意map模板类的第三个模板参数,这个参数决定元素按键值升序或者降序在map中的存储方式:
默认:less<key>升序----- < -----第一个小于取第一个
可设置:greater<key>降序------- > -----第一个大于取第一个
也可以自己定义键值比较函数,用函数名作为第三个参数
这个参数默认map 中的元素是以键值key递增存储的。
如果需要递减存储就设置第三个参数未greater<key>。
注意,key是你设置的数据的类型。
以上是初始建立map对象时设置的,如果运用过程中想要修改map容器的元素的存储顺序,怎么办:
自定义键值比较函数
详细链接
map中当key是结构体或者类时,需要重载哪些函数
看链接可知:函数对象中实现对函数调用符--小括号的重载。而map传递过去用于比较的是map的键,但是如果键是结构体或者类,那么结果或者类是比较不了的,所以这个时候需要我们自己重定义这个函数对象,重载()的时候,不是比较结构体或者类,而是比较结构体或者类中的某一个元素。
map实现按值排列存储---实现pair对存储数据
map实现不了按值存储,即使你实现了pair对按序插入,也不会按序在map中存储。我们只能将map中的pair对存储在vector中,让后自定义排序函数对pair对进行排序。
#include <iostream>
#include <map>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
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;
}
};
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].first<<name_score_vec[i].second<<endl;
}
return 0;
}
set
和map同理