关联容器map按照value排序或者按照key排序

来源:互联网 发布:飞机大战java代码框架 编辑:程序博客网 时间:2024/05/21 10:29
map/multimap元素的关键字类型必须定义行为正常的<运算符或者重载operator()仿函数来比较关键字
unordered_map/unorder_multimap元素的关键字使用==运算符,或者重写()运算符和一个hash<key_type>类型的对象来组织元素
map/multimap插入元素:

map.insert(make_pair(key,value))

map.insert(pair<key,value>(key,value))

map[key]=value map使用一个不在容器中的关键字作为下标,会添加一个具有该关键字的元素到map中

通过auto ret=map.insert(make_pair(key,value))        若ret.second==false,则key已经存在,insert实际不进行任何操作。如果key不存在,元素被插入到map中,ret.second==true。


map/multimap删除元素:

map.erase(key) 删除关键字为key的元素,返回删除元素的个数

map.erase(iterator iter) 删除迭代器iter指定的元素,返回指向iter后一个元素的迭代器

map.erase(fir_iter,end_iter) 删除指定范围内的元素,返回end_iter


map/multimap访问元素:

map.find(key) 查找容器是否存在key的元素。返回指向第一个关键字为key的迭代器

map.cout(key) 返回容器中关键字为key的元素个数

一:map按照value进行排序

利用std::sort函数去排序

void sort(RanIt first,RanIt last,Rred cmp)

创建一个结构体id_value去保存map中的key和value;

遍历map,把map中所有的值存放一个Vector<结构体id_value>中去

利用std::sort排序函数自定义比较函数把Vector中的结构体按照value大小排序

根据排序好的Vector取出结构体中的id即可对应map中的key


bool cmp(A &a1; A  &a2)

{

return a1.member>a2.member;

}

cmp比较函数可以是成员函数,但是必须是静态成员函数

或者是全局非成员函数。



二:map按照key进行排序,自定义类型作为map的key

map是顺序容器,即元素会按照key的大小进行排序。如果key是自定义元素,则需要自定义仿函数作为map的比较函数,仿函数(functor),就是使一个类的使用看上去像一个函数。其实现就是类中实现一个operator(),这个类就有了类似函数的行为,就是一个仿函数类了。

或者在自定义类中重载定义<操作符

#include<iostream>#include<map>using namespace std;class A{public:A(int x){this->mynum=x;};bool operator<(const A &a)const //const放在函数后面,const是修饰this指针指向的对象,表示该成员函数不会修改类的数据{return this->mynum<a.mynum;}int mynum;};struct compare{bool operator()(const A &a1,const A &a2){return a1.mynum<a2.mynum;}};int main(){std::map<A,int,compare> my_map;A first(100);A second(200);A three(50);my_map[first]=100;my_map[second]=200;my_map[three]=50;for(std::map<A,int>::iterator iter=my_map.begin();iter!=my_map.end();iter++){cout<<iter->second<<endl;}return 0;}


三:自定义类型作为unordered_map的key

#include<iostream>#include <boost/unordered_map.hpp>#include<functional>using namespace std;class A{public:A(int x){this->mynum=x;};bool operator==(const A &a)const{return (this->mynum==a.mynum);}int mynum;};struct HashFunc{std::size_t operator()(const A &a)const{return boost::hash<int>()(a.mynum);}};int main(){boost::unordered_map<A,int,HashFunc> my_map;A first(100);A second(200);A three(50);my_map[first]=100;my_map[second]=200;my_map[three]=50;for(boost::unordered_map<A,int>::iterator iter=my_map.begin();iter!=my_map.end();iter++){cout<<iter->second<<endl;}return 0;}



原创粉丝点击