C++primer -关联容器-map、set

关联容器基础类型为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都有的操作:

注意对于关键字不可重复的mapset,不会插入一个关键字重复的元素且执行insert也不会做任何操作,对于关键字可重复的multimapmultiset,可以成功插入。

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))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值