set是C++ STL中基于红黑树实现的关联容器,1. 元素唯一且自动升序排列;2. 插入、删除、查找时间复杂度为O(log n);3. 不支持下标访问,需用迭代器遍历;4. 键即值,不可直接修改元素,需先删后插;5. 可自定义排序如降序;适用于去重、有序存储及集合运算。

set 是 C++ 标准模板库(STL)中的一种关联式容器,用于存储唯一且自动排序的元素。它基于红黑树(一种自平衡二叉搜索树)实现,因此插入、删除和查找操作的时间复杂度为 O(log n),效率较高。
set 的主要特点
理解 set 的核心特性有助于正确使用它:
- 元素唯一性:set 中不允许有重复值,插入相同值时,多余的会被忽略。
- 自动排序:元素在插入时会按照升序(默认)自动排列。
- 不可通过下标访问:不能像数组那样用 index 访问元素,需使用迭代器遍历。
- 键即值:set 中每个元素既是键也是值,没有额外的数据域(与 map 不同)。
常用操作与示例代码
以下是 set 常见操作的使用方法,配合简单示例说明:
#include#include int main() { std::set numbers; // 插入元素 numbers.insert(5); numbers.insert(1); numbers.insert(9); numbers.insert(1); // 重复元素,不会被插入 // 遍历输出(自动升序) for (const auto& num : numbers) { std::cout << num << " "; } // 输出:1 5 9 std::cout << "\n大小:" << numbers.size(); // 查找元素 if (numbers.find(5) != numbers.end()) { std::cout << "\n找到元素 5"; } // 删除元素 numbers.erase(1); // 再次遍历 std::cout << "\n删除后:"; for (const auto& num : numbers) { std::cout << num << " "; } // 输出:5 9 return 0; }
自定义排序规则
默认情况下,set 按升序排列。如果需要降序或其他比较逻辑,可以传入自定义比较函数或仿函数:
立即学习“C++免费学习笔记(深入)”;
// 降序排列 std::set> descSet; descSet.insert(3); descSet.insert(1); descSet.insert(8); for (const auto& n : descSet) { std::cout << n << " "; } // 输出:8 3 1
适用场景建议
set 特别适合以下情况:
- 需要去重并保持有序的数据集合。
- 频繁进行查找、插入、删除操作,且要求较高效率。
- 处理数学集合运算,如并集、交集(可结合算法头文件中的 set_union、set_intersection 使用)。
基本上就这些。掌握 set 能帮助你更高效地管理有序唯一数据,是 C++ 编程中非常实用的工具之一。注意它不支持修改已有元素(因为会影响排序),如需更新应先删除再插入。











