【C++】STL关联式容器之map和set

【关联式容器】之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& 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 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有序的序列。

你可能感兴趣的:(C++,数据结构,数据结构,哈希算法)