set 与 map 底层实现及高频算法实战
在 C++ STL 中,set 和 map 是处理键值对和集合操作的核心容器。它们底层通常基于红黑树(Red-Black Tree)实现,保证了增删查改的时间复杂度为 O(logN)。理解它们的内部机制,对于解决算法题至关重要。
set 类的实现与特性
set 默认要求元素类型支持比较运算。如果默认行为不符合需求,可以通过仿函数自定义排序规则。内存分配方面,它使用空间配置器,高级场景下可替换为自定义内存池。
由于底层是红黑树,set 中的元素天然有序(中序遍历为升序)。迭代器遍历时,顺序即为排序后的顺序。
构造与迭代
插入数据时,set 会自动完成去重和排序操作。
#include <iostream>
#include <set>
using namespace std;
int main() {
set<int> s;
// set<int, greater<int>> s; // 降序排列
s.insert(4);
s.insert(3);
s.insert(8);
s.insert(9);
s.insert(2);
s.insert(6);
auto it = s.begin();
while (it != s.end()) {
cout << *it << " ";
++it;
}
cout << endl; // 输出:2 3 4 6 8 9
return 0;
}
注意,set 不支持直接修改元素值,因为一旦修改可能破坏红黑树的平衡结构,导致迭代器失效或逻辑错误。
支持 initializer_list 初始化,重复插入的值会被忽略。
s.insert({2, , , });
( e : s) {
cout << e << ;
}


