1. map的概念
map<key,value> mp,map翻译为映射,key具有唯一性,key-value为一对一的映射关系,map自带的自动排序是根据key的值来排序的。
2. map的基本操作
map<key,value> mp,定义一个map
mp.find(key);返回键为key的映射的迭代器,找不到则返回mp.end(); O(logn)
mp.count(key); 有此key返回1,否则返回0;
mp.size();map中映射的对数 O(1)
mp.clear();清空mp中所有元素
3. pair介绍
pair可以用来代替具有两个元素的结构体;
pair<type1,type2> name;
pair<char,int> p(‘c’,5);初始化
若想临时构建一个pair,pair<string,int>(“haha”,5)或者make_pair(“haha”,5);
Pair中两个元素first和second,按访问结构体的方式访问;name.first和name.second
4. map元素的插入
第一种
map具有两个类型,元素插入方式较为特殊,需要用到pair;
mp.insert(make_pair(“haha”,5) );
mp.insert(pair<string,int>(“haha”,5) );
若已有此键值时不会覆盖原元素;
第二种
Map可以通过下标插入
例如:mp[str]=int;
与上面不同的是若已经有此key键,则会覆盖原元素
5. map元素的删除
与set一样,map的key值具有唯一性,删除函数的参数可以为迭代器或者key键;
Mp.erase(it);
Mp.erase(key);
Mp.erase(it1,it2);删除区间内元素;
6. map元素的访问
(1) 通过下标访问
Map<char,int> mp;
Mp[‘c’]++;
Cout<<mp[‘c’];
需要注意的是,这种访问方式若没有此键值的时候会自动建立并且value值初始化为0;
(2) 通过迭代器访问
Map<type1,type2>::iterator it;
可以通过it->first或者(*it).first和it->second或者(*it).second来访问key值和value值
7. map的排序
map中自动按key值从小到大排序,如存放结构体或者需要自定义排序规则,和set的更改方式一样,请自行查看set;
此处值介绍最简单的更改排序的方式
Map<char,int,greater<char> > mp;按键值从大到小排序;
关于map按value排序,map并不支持按value值排序,需要自己想办法实现;
可以将map的key和value值存放在pair数组或者pair类型的vector中,用sort排序;
注意:排好序后不能再放进map中,否则会再根据key值排序;
问:为什么不把map<type1,type2>放进map<type2,type1>中排序
答:value值不是唯一的,而key值是唯一的,颠倒过来会自动删除重复的value值,从而导致key键减少;