序列式容器和关联式容器
前面我们已经接触过 STL 中的部分容器如:string、vector、list、deque、array、forward_list 等,这些容器统称为序列式容器,因为逻辑结构为线性序列的数据结构,两个位置存储的值之间一般没有紧密的关联关系,比如交换一下,它依旧是序列式容器。顺序容器中的元素是按它们在容器中的存储位置来顺序保存和访问的。
关联式容器也是用来存储数据的,与序列式容器不同的是,关联式容器逻辑结构通常是非线性结构,两个位置有紧密的关联关系,交换一下,它的存储结构就被破坏了。顺序容器中的元素是按关键字来保存和访问的。关联式容器有 map/set 系列和 unordered_map/unordered_set 系列。本章节讲解的 map 和 set 底层是红黑树,红黑树是一颗平衡二叉搜索树。set 是 key 搜索场景的结构,map 是 key/value 搜索场景的结构。
set 系列的使用
set 类的介绍
set 的声明如下,T 就是 set 底层关键字的类型。set 默认要求 T 支持小于比较,如果不支持或者想按自己的需求走可以自行实现仿函数传给第二个模板参数。set 底层存储数据的内存是从空间配置器申请的,如果需要可以自己实现内存池,传给第三个参数。一般情况下,我们都不需要传后两个模板参数。set 底层是用红黑树实现,增删查效率是 O(logN),迭代器遍历是走的搜索树的中序,所以是有序的。前面部分我们已经学习了 vector/list 等容器的使用,STL 容器接口设计,高度相似,所以我们就不再一个接口一个接口的介绍,而是直接带着大家看文档,挑比较重要的接口进行介绍。默认是小堆,想要大堆修改第二个参数,就是仿函数。
template < class T, // set::key_type/value_type
class Compare = less<T>, // set::key_compare/value_compare 仿函数
class Alloc = allocator<T> // set::allocator_type
>
class set;
insert 和迭代器遍历使用样例
有重复的值,会被去除。
可以看到,如果有 2 个 5,有一个 5 会被去除。

插入一段 initializer_list 列表值,如果已经存在了,这个值就不会插入。

遍历 string,是比较 ASCII 码大小顺序遍历的。










