map和multimap将key/value pair当作元素进行管理。它们可根据key的排序准则自动为元素进行排序。multimap允许元素重复,但map不允许。map和multimap位于头文件
Key 和 value必须都是copyable(可复制的)和movable(可移动的)
对指定的排序规则,key必须是可比较的
如果没有指定排序规则,那就使用默认的less<>排序规则,以operator<进行比较。map和multimap通常也是以平衡二叉树来完成。map和multimap会对key/value根据key的排序规则自动排序,也可以很方便的通过key找到value,但是通过value找到key效率并不是很好。和set一样,不能直接修改元素的key,要想修改元素的key,需要先移除拥有该key的元素,然后插入新的key/value的元素,对于value可以直接更改。
操作函数:
构造函数,拷贝构造,拷贝赋值,析构函数
操作 | 功能 |
---|---|
map m; | 默认构造函数,创建一个空的map/multimap |
map m(op) | 建立一个空的map/multimap对象,以op为排序准则 |
map m(m2) | copy constructor |
map m = m2; | copy constructor |
map m(rv) | move constructor.rv的所有资源被释放 |
map m = rv | move constructor.rv的所有资源被释放 |
map m(beg,end) | 以区间[beg,end)内的元素为m的初值 |
map m(beg,end,op) | 以区间[beg,end)内的元素为m的初值,以op为排序准则 |
map m(initlist) | 列表初始化 |
map m = initlist | 列表初始化 |
m.~map() | 析构函数 |
其中 map 的形式为以下几种:
map | 含义 |
---|---|
map<key,Value> | 一个map使用默认的排序准则 |
map<key,Value,Op> | 一个map使用op排序准则 |
multimap<key,Value> | 一个multimap使用默认的排序准则 |
multimap<key,Value,Op> | 一个multimap使用op排序准则 |
非更改操作:
操作 | 功能 |
---|---|
c.key_comp() | 返回 op |
c.value_comp() | 返回 针对value的排序准则 |
c.empty() | 容器是否为空 |
c.size() | 目前的元素个数 |
c.max_size() | 元素个数的最大可能量 |
c1 == c2 | c1是否等于c2(每个元素调用 == ) |
c1 != c2 | c1 是否 不等于 c2 |
c1 < c2 | c1 是否小于 c2 |
c1 > c2 | c1 是否大于 c2 |
c1 <= c2 | c1 是否小于等于c2 |
c1 >= c2 | c1 是否大于等于 c2 |
查找函数:
操作 | 功能 |
---|---|
c.count(val) | 返回容器中key为val的个数 |
c.find(val) | 返回容器中第一个元素为key为val的元素,没有返回end() |
c.lower_bound(val) | 返回key为val第一个可以插入的位置,也就是key>=val的第一个位置 |
c.upper_bound(val) | 返回key为val最后一个可以插入的位置,也就是key>val的第一个位置 |
c.equal_range(val) | 返回key为val可被插入的第一个位置和最后一个位置即key==val的元素区间 |
赋值操作:
操作 | 效果 |
---|---|
c = c1 | copy assignment,将c2元素赋值给c |
c = rv | move assignment, |
c = initilist | 将初值列的元素赋值给c |
c1.swap(c2) | 交换c1和c2的元素 |
swap(c1,c2) | 交换c1和c2的元素 |
迭代器:
操作 | 效果 |
---|---|
c.begin() | 返回一个 bidirectional iterator指向第一元素 |
c.end() | 返回一个 bidirectional iterator指向末尾元素的下一位置 |
c.cbegin() | 返回一个 const bidirectional iterator指向第一元素 |
c.cend() | 返回一个 const bidirectional iterator指向末尾元素的下一位置 |
c.rbegin() | 返回一个 reverse iterator指向反向迭代的第一元素 |
c.rend() | 返回一个 reverse iterator指向反向迭代的末尾元素的下一位置 |
c.crbegin() | 返回一个 const reverse iterator指向反向迭代的第一元素 |
c.crend() | 返回一个const reverse iterator指向反向迭代的末尾元素的下一位置 |
元素操作:(下面的元素指的是 key/value pair)
操作 | 效果 |
---|---|
c.insert(val) | 插入val,并返回新元素的位置 |
c.insert(pos,val) | 以pos为起点在[pos,end)中插入val,返回新元素的位置 |
c.insert(beg,end) | 将区间[beg,end)内的元素插入到c中 |
c.insert(initlist) | 将初值列的元素插入到c中 |
c.emplace(args…) | 插入一个args元素的值,并返回新元素的位置 |
c.emplace_hint(pos,args…) | 以pos为起点在[pos,end)中插入args,返回新元素的位置 |
c.erase(val) | 移除与 val相等的所有元素,返回被移除的个数 |
c.erase(pos) | 移除iterator位置pos上的元素,无返回值 |
c.erase(beg,end) | 移除区间[beg,end)内的元素,无返回值 |
c.clear() | 将容器清空 |
关联式操作:
操作 | 效果 |
---|---|
m[key] | 如果key存在,则返回key元素的值,如果不存则插入一个key/value元素 |
m.at(key) | 返回对应key/value中对应key的value |
示例代码如下:
1 |
|