map是标准的关联式容器,一个map是一个键值对序列,即(key,value)对。它提供基于key的快速检索能力。
map中key值是唯一的。集合中的元素按一定的顺序排列。元素插入过程是按排列规则插入,所以不能指定插入位置。
map的具体实现采用红黑树变体的平衡二叉树的数据结构。在插入操作和删除操作上比vector快。
map可以直接存取key所对应的value,支持[]操作符,如map[key]=value。
multimap与map的区别:map支持唯一键值,每个键只能出现一次;而multimap中相同键可以出现多次。
multimap不支持[]操作符。
使用前准备:
#include <map>
using namespace std;
默认构造:
map<T1,T2> map TT;
multimap<T1,T2> multimap TT;
map的插入与迭代器:
三种方式:
1.通过pair的方式插入对象,例如:
map.insert(pair<int,string>(3,"小张“));
2.通过value_type的方式插入对象,例如:
map.insert(map<int,string>::value_type(1,"小李"));
3.通过数组方式插入值:
map[3]="小刘";
map[5]="小王";
第三种方式非常直观,但存在一个性能问题。插入3时,先在map中查找主键为3的项,若没发现,则将一个键为3,值为初始化值的对组插入到map中,然后再将值修改为"小刘"。若发现已存在这个键,则修改这个键对应的value。
前两种方式,采用的是insert()方法,该方法返回值为pair<iterator,bool>
pair<map<int,string>::iterator,bool> pairResult=mapStu.insert(pair<int,string>(3,"小张"));
如果插入成功,(pairResult.first)->first==3,(pairResult.first)->second=="小张",pairResult.second==true
map的插入与迭代器
map<T1,T2,less<T1>> mapA;
map<T1,T2,greater<T1>> mapB;
less与greater用法见set,less<T1>与greater<T1>可以替换成其他的函数对象functor
map的插入与迭代器
map.begin();
map.end();
map.rbegin();
map.rend();
map对象的拷贝构造与赋值
map(const map &mp);
map& operator=(const map &mp);
map.swap(mp);
map的大小
map.size();
map.empty();
map的删除
map.clear();//删除所有
map.erase(pos);//删除pos迭代器所指的元素,返回下一个元素的迭代器
map.erase(beg,end);删除区间[beg,end)的所有元素,返回下一个元素的迭代器
map.erase(keyElem);删除容器中key为keyElem的对组
map.equal_range(keyElem);//返回容器中key与keyElem相等的上下限的两个迭代器。上限是闭区间,下限是开区间,如[beg,end)。此函数返回两个迭代器,而这两个迭代器被封装在pair中。
map的查找
map.find(key);查找key是否存在,若存在,返回该键的元素的迭代器,若不存在,返回map.end();
map.count(keyElem);返回容器中key为keyElem的对组个数。对map来说,只能是0或1,对于multimap来说,值可能大于1。
map.lower_bound(keyElem);返回第一个key>=keyElem的元素的迭代器。
map.upper_bound(keyElem);返回第一个key>keyElem元素的迭代器