关联容器基础类型为map和set,针对它们是否有序、关键字是否可重复又衍生出一些类型,默认map和set(不加前缀情况下)是有序且关键字不重复的。
map、set前面可加前缀表示新的关联容器类型,前缀如下:multi-可重复关键字的、unordered-无序的
例:multimap :可重复关键字的有序map 、unordered_multimap : 可重复关键字的无序map 、unordered_map: 不可重复关键字的无序map
set<value_type> : 关键字等于值或者说没有值的关联容器,对于:查找一个元素是否存在于序列中 的操作效率高 ,因此通常用于保存黑白名单。
map<key类型, 值类型>: map是一种 关键字-值 组成的对(也叫键值对) ,默认有序且关键字不重复,每个关键字只对应一个值。
map特有的操作:
map<typeof-key, typeof-value> m;
下标操作:m[key] / m.at(key) : 只支持非const的map。若关键字为key的元素已存在,则返回该元素的值,若不存在,则创建一个关键字为key的元素,值默认初始化。
pair :
map中的元素是pair类型的,pair是一种容器,装有一对元素(两个元素),用first和second标记,map将第一个元素作为key第二个作为值。如何创建一个pair?
make_pair(first, second) : 生成一个pair元素,自动推导其类型。
pair<first_type, second_type>(first, second) : 生成一个 first_type, second_type类型的pair元素。
关联容器有三种类型可以被提取:
1、key_type : 关键字类型
2、value_type : 关联容器的元素类型, 对map是pair<const key_type, mapped_type>的类型,对set等于key_value。
3、mapped_type : map的专有类型,map的值类型。
提取方式:map<string, int> m; decltype(m):: key_type; // 得到const string 类型。
关联容器支持所有容器都支持的操作,如迭代器等。关键字不可改变,所以关键字类型为const,因此set的迭代器类型也是const_iterator
map、 set支持用迭代器遍历,按迭代器遍历得到的是按关键字从小到大排列的元素序列,也支持*iter。
关联容器的插入删除使用:insert、erase、emplace等成员函数, 且提供了按关键字插入删除的版本。
map\set都有的操作:
注意对于关键字不可重复的map和set,不会插入一个关键字重复的元素且执行insert也不会做任何操作,对于关键字可重复的multimap和multiset,可以成功插入。
insert(v)//insert(b, e)/insert(il) | 将元素/迭代器序列中的元素/列表中的元素 拷贝插入到关联容器,对关联容器排序调整后,返回 pair<指向插入元素的迭代器,插入是否成功的bool值>/void/ void |
insert(p, v) | 优先在p迭代器之后的位置寻找插入位置,返回指向插入元素的迭代器。 |
emplace(v)/emplace(p,v) | 插入元素/优先在迭代器p后查找插入位置,返回指向插入元素的迭代器 |
erase(k)/erase(p)/erase(b,e) | 根据关键字/迭代器/迭代器序列删除元素 |
都有迭代器:
m.begin()/st.begin()/m.end()/st.end() | 它们返回按照map、set的关键字排序得到序列的最小元素和最大元素之后的位置的迭代器。 |
++m_it/++s_it | 取map/set按排序序列得到的下一个元素。 |
== / != | map/set迭代器支持相等和不等比较 |
*m_it/*s_it | 支持取迭代器对应的元素,也支持 -> |
除此之外,关联容器还支持关键字查找函数:
find(key) | 查找关键字为key的元素是否存在,存在返回第一个关键字为k的迭代器,否则返回尾后迭代器 |
count(key) | 返回关键字为key的元素有几个 |
lower_bound(key) | 返回第一个关键字不小于key的元素迭代器,不支持无序容器 |
upper_bound(key) | 返回第一个关键字值大于key的元素迭代器,不支持无序容器 |
equal_range(key) | 返回关键字等于key的迭代器序列头尾的pair |
所以查找关键字等于key的序列有三种方法:
[lower_bound(key) , upper_bound(key))
[equal_bound(key).first, equal_range(key).second)
[lower_bound(key), lower_bound() + count(key))