1. 序列式容器和关联式容器
在 C++ STL 中,我们常见 string、vector、list、deque 等容器,它们统称为序列式容器。这类容器的逻辑结构是线性序列,元素按存储位置顺序保存和访问,交换位置通常不影响其逻辑。
与之相对的是关联式容器,如 map/set 系列和 unordered_map/unordered_set 系列。关联式容器的逻辑结构通常是非线性的(底层多为红黑树或哈希表),元素通过关键字(Key)进行保存和访问,两个位置的值之间存在紧密的关联关系。
本文重点讲解 set 和 multiset,它们的底层实现都是红黑树(一种平衡二叉搜索树)。set 适用于 Key 搜索场景,而 map 则用于 Key-Value 搜索场景。
2. set 系列的使用
2.1 set 类的介绍
set 的模板声明如下:
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;
这里有几个关键点需要注意:
- T:代表底层关键字的类型。
- Compare:默认要求 T 支持小于比较(
less<T>)。如果不支持或需要自定义排序规则(如降序),可以自行实现仿函数传给第二个模板参数。 - Alloc:内存分配器。一般情况下无需手动指定,使用默认配置即可。
- 性能:底层基于红黑树,增删查效率为 O(logN)。迭代器遍历遵循中序遍历,因此
set中的元素默认是有序的。
虽然库中使用 T 作为模板参数名,但在语义上它更接近于 Key。STL 容器接口设计高度相似,掌握基础后可以直接参考文档查阅具体接口。
2.2 set 的迭代器和构造
set 的迭代器属于双向迭代器,支持正向和反向遍历:
// 正向迭代器
iterator begin();
iterator end();
// 反向迭代器
reverse_iterator ;
;


