1、关联式容器
在c++初阶阶段,我们已经接触了STL的部分容器,比如:vector,list,deque,forward_list等。
这些容器统称为序列式容器,因为其底层为线性序列的数据结构,里面存储的就是数据本身。
而关联式容器同样也是用来存储数据的容器,但与序列式容器不同的是,里面存储的<key,value>结构的键值对,在数据检索的时候比序列式容器的效率更高。
2、键值对
键值对用来表示具有一一对应关系的一种结构,该结构中一般包含两个成员变量key和value,key表示键值,value表示与key对应的信息,比如:现在需要建立一个英汉互译的字典,那该字典中必然有英文单词和其中文的含义,而且英文单词与其中文含义是一一对应的关系,通过英文单词就可以找到其中文含义。
3、树形结构的关联式容器
根据应用场景的不同,STL总共实现了两种不同结构的管理式容器:树形结构和哈希结构。树形结构的关联式容器主要有四种:map、set、multimap、multiset。这四种容器的共同点式:使用平衡二叉树(红黑树)作为其底层结果,容器中的元素是 一个有序的序列。
3.1set
3.1.1set的介绍
set是继承自collection的一个接口类,并且要求key一定唯一,set的底层是使用map来实现的,set的最大功能是对集合中的元素进行了去重,实现set接口类有树形Treeset和哈希性Hashset,set中的key不能修改,如果要修改,必须将原来的删掉,然后再重新插入修改后的值。
定义:
- set是按照一定次序存储元素的容器
- 在set中,元素的value也标识它(value就是key,类型为T),并且每个value必须是唯一的。 set中的元素不能在容器中修改(元素总是const),但是可以从容器中插入或删除它们。
- 在内部,set中的元素总是按照其内部比较对象(类型比较)所指示的特定严格弱排序准则进行排序。
- set容器通过key访问单个元素的速度通常比unordered_set容器慢,但它们允许根据顺序对子集进行直接迭代。
- set在底层是用二叉搜索树(红黑树)实现的。
NOTICE !!!
|
1、与map/multimap不同,map/multimap中存储的是真正的键值对<key, value>,set中只放 value,但在底层实际存放的是由<value, value>构成的键值对。
- set中插入元素时,只需要插入value即可,不需要构造键值对。
- set中的元素不可以重复(因此可以使用set进行去重)。
- 使用set的迭代器遍历set中的元素,可以得到有序序列
- set中的元素默认按照小于来比较
- set中查找某个元素,时间复杂度为:$log_2 n$
- set中的元素不允许修改(为什么?)
set中的底层使用二叉搜索树(红黑树)来实现
3.1.2set的使用
set的初始化
empty (1) | explicit set (const key_compare& comp = key_compare(), const allocator_type& alloc = allocator_type()); |
---|---|
range (2) | template <class InputIterator> set (InputIterator first, InputIterator last, const key_compare& comp = key_compare(), const allocator_type& alloc = allocator_type()); |
copy (3) | set (const set& x) |
1、set 的模板参数列表
T:set存放元素的类型,在底层中存储的实际上是<value,value>的键值对。
Compare:set中元素默认按照小于来比较。
Alloc:set中元素空间管理的方式,使用STL提供的空间配置器来管理
2、set的迭代器
3.set的容量
1)、bool empty() const 检查set是否为空,空则返回true,否则返回true
2)、size_t size() const 返回set中有效元素的个数
4、set的修改操作
5、set使用案列
3.2.map
3.2map
3.2.1map的介绍
map是一个接口类,该类没有继承自collection类,不能直接实例化对象,如果要实例化对象只能实例化 其实现类TreeMaphe或者HashMap,该类中存储的是<key,value>结构的键值对,并且k一定是唯一的,不能重复。且Map中键值对的key不能修改,value可以修改,如果要修改key,只能将key删除掉,然后再来进行重新插入。
1、模板参数说明
key:键值中key的leixing
T:键值中value 的类型
compare:比较器的类型,在缺省的情况下,按照小于比较。
Alloc:空间配置器,用来配置空间,不需要用户传递吗,除非用户不想使用标准库提供的空间配置器。
2、迭代器的类型
参见cplusplus官网定义
1、map是关联式容器,他按照特定的次序存储由键值key和值value组合而成的元素。
2、在map中,键值key通常用于排序个唯一地标识元素,而值value中存储与此键值key关联的内容,键值key和value的类型可能不同。
3.2.2map的容器和元素访问
empty----------判断map是否为空
Test whether container is empty (public member function )
size--------------返回map元素的个数
Return container size (public member function )
max_size
Return maximum size (public member function )
map在元素访问的时候,有一个与operator[]类似的操作,都是通过key直接找到与key相对应的value然后将其引用返回,不同的是,当key不存在时,一般的operator[] 函数会抛出异常,而map中重载的operator[]函数会默认构造一个key和value键值对然后返回这个刚创建好的键值对的value引用。
3.2.3map中元素的修改