C++ set 与 map 容器详解
在 C++ STL 中,除了顺序式容器外,还有关联式容器。本节重点讲解 set 与 map。
1. 顺序式容器与关联式容器
STL 中的 string、vector、list、deque、array、forward_list 等统称为序列式容器,逻辑结构为线性序列,元素按存储位置保存和访问。
关联式容器逻辑结构通常是非线性结构,元素按关键字保存和访问。主要包括 map/set 系列和 unordered_map/unordered_set 系列。
注: 本篇讲解的 map 和 set 底层是红黑树(平衡二叉搜索树)。set 是 key 搜索场景的结构,map 是 key/value 搜索场景的结构。
2. set
2.1 set 使用介绍
set 的底层是 Key 搜索场景的结构。声明中 T 是底层关键字类型,默认执行小于比较。若需自定义比较规则可传入仿函数作为第二个模板参数;内存分配器可作为第三个参数,一般情况无需传递。
• set 底层用红黑树实现,增删查效率 O(logN),迭代器遍历走中序,因此有序。
2.1.1 构造和迭代器
set 支持正向和反向遍历,迭代器为双向迭代器,支持范围 for。遍历时默认升序。由于底层是二叉搜索树,迭代器只有读权限,不支持修改元素数据,否则会破坏树结构。
未显式传 comp 参数时默认为 key_compare(即 less 仿函数)。
常用构造函数:
explicit set (const key_compare& comp = key_compare(), const allocator_type& alloc = allocator_type());// 无参默认构造template <class InputIterator> set (InputIterator first, InputIterator last, ...);// 迭代器区间构造set (const set& x);// 拷贝构造set (initializer_list<value_type> il, ...);// initializer 列表构造
常用迭代器:
iterator begin(); iterator end();// 正向迭代器reverse_iterator rbegin(); reverse_iterator rend();// 反向迭代器
2.1.2 增删查
set 提供 insert 进行插入,没有 push 系列函数,因为插入需维护搜索二叉树结构。
insert 接口:
// 单个数据插入,如果已存在则失败
pair<iterator,bool> insert (const value_type& val);
// 列表插入,已存在的值不会插入
void insert (initializer_list<value_type> il);
// 迭代器区间插入
template <class InputIterator> ;


