【关联式容器】之map和set
- 容器类型
- 树形结构的关联式容器
- map
- set,multiset,multimap的区别与联系
容器类型
在STL中,我们接触过许多容器,例如:vector,list,stack,queue,map,set,unordered_map,unordered_set,multimap,multiset等,实际上是可以将其分为两种类型。
第一种是序列式容器:其底层结构为线性序列的数据结构
第二种是关联式容器:其存储的类型是键值对,这样的存储类型使得在数据检索时比序列式容器的效率更高
序列式容器 | 关联式容器 |
---|---|
vector,list,stack,queue | map,multimap,set,mutiset,unordered_map, unordered_set,unordered_multimap,unordered_multiset |
树形结构的关联式容器
STL实现了两种不同结构的关联式容器,树形结构和哈希结构(C++11实现的)。
而树形结构的关联式容器有四种:map、set、multimap、multiset,它们的特点是使用平衡搜索树(也就是红黑树)作为其底层结构,按照key是有序的。
而另外一种哈希结构的关联式容器也有四种:unordered_map,unordered_set,unordered_multimap,unordered_multiset,它们的特点是使用哈希作为其底层结构,key是无序的。
map
map中的模板参数是:
其中key表示键值对中key的类型,T表示键值对中value的类型,compare表示比较器的类型,比较方式是按照key来进行比较的,如果没有传递比较方法,是按照小于来比较。Allocator是空间配置器,用来申请底层空间,一般不需要传递。
map的构造:
函数声明 | 功能介绍 |
---|---|
map() | 构造一个空的map |
map ( const map<Key,T,Compare,Allocator>& x ) | 拷贝构造 |
map ( InputIterator first, InputIterator last,const Compare& comp = Compare(), const Allocator& = Allocator() ) | 通过迭代器进行构造 |
map的迭代器:
函数声明 | 功能介绍 |
---|---|
`begin() /end() | begin()`:首元素的位置,end():最后一个元素的下一个位置 |
rbegin()/rend() | 反向迭代器,rbegin()在end的位置,rend()在begin()的位置 |
map的容量和元素访问
函数声明 | 功能介绍 |
---|---|
bool empty ( ) const | 检测map中的元素是否为空,是返回true,否则返回false |
size_type size() const | 返回map中有效元素的个数 |
mapped_type& operator[] (constkey_type& k) | 返回key对应的value |
operator[]和at的区别
请注意:如果使用[]来进行元素访问时,本质上是通过key找到与key对应的value,将键值对进行返回,但是如果没有对应的key,那么会用当前key和默认value构造键值对进行插入,然后返回默认的value,也就意味着,使用[]时,无论key存在与否,都会返回一个value。而使用at时,如果key不存在,at()函数直接抛异常
map中元素的修改
函数声明 | 功能介绍 |
---|---|
pair<iterator,bool> insert (const value_type& x ) | 插入一个键值对x,返回的也是键值对, 返回的first表示插入元素的位置,second表示插入是否成功 |
void erase ( iterator position ) | 删除pos位置的元素 |
size_type erase ( constkey_type& x ) | 删除键值key为x的元素 |
void erase ( iterator first,iterator last ) | 删除迭代器区间为[first,last)之间的元素 |
set,multiset,multimap的区别与联系
与map相比,set中只有value,没有key,其余的特性和map是一样的
而multiset是在set的基础上,value由唯一变为了可以重复,仅此而已,特点是multiset可以对元素进行排序。
而multimap是在map的基础上,key由唯一变为了可以重复,通过multimap对元素进行访问时通常比unordered_multimap慢,但是使用迭代器对multimap进行遍历时,会得到关于key有序的序列。