在 C++ 标准模板库(STL)中,set 与 map 作为经典的关联式容器,凭借红黑树底层的高效性能与有序存储特性,成为处理键值映射、数据去重、快速查找等场景的核心工具。与 vector、list 等序列式容器不同,它们以关键字为核心组织数据,兼顾排序性与操作效率(增删查均为 O(log N)),是 C++ 开发中处理复杂数据逻辑的必备利器。
容器体系概览
序列式与关联式
序列式容器的逻辑结构为线性序列,元素按存储位置顺序保存和访问,如 string、vector、list 等。交换元素通常不会破坏结构。
关联式容器则用于存储具有紧密关联关系的数据,逻辑结构通常是非线性的。常见的是基于红黑树的 map/set 系列和基于哈希表的 unordered_map/unordered_set 系列。其特点是元素按关键字来保存和访问,增删查效率稳定在 O(log N)。
set 系列详解
构造与初始化
set 支持多种构造方式,核心在于理解模板参数中的比较规则(默认升序)和内存分配器。
template < class T,
class Compare = less<T>,
class Alloc = allocator<T> >
class set;
- 无参默认构造:创建空容器,后续动态添加。注意
explicit关键字禁止了隐式类型转换。 - 迭代器区间构造:从其他容器或数组批量导入初始元素,自动去重并排序。
- 拷贝构造:深拷贝原容器的所有元素及排序规则。
- 初始化列表构造:C++11 起支持,语法简洁,适合已知初始集合的场景。
示例:利用初始化列表快速构建降序 set。
#include <iostream>
#include <set>
#include <functional>
using namespace std;
int main() {
// 传入 greater<int>() 构造降序的空 set
set<int, greater<int>> s2({5, 2, 5, 1, 3});
for (auto e : s2) cout << e << ;
;
}


