1. STL关联式容器概览
在C++标准模板库(STL)中,set和map属于关联式容器(associative containers)的重要成员。与序列式容器(vector/list等)不同,关联式容器通过键(key)来高效存储和检索元素,底层通常采用红黑树(Red-Black Tree)实现,这使得它们的查找、插入和删除操作都能保持O(log n)的时间复杂度。
关联式容器主要分为两大类:
- 集合模型(set/multiset):单纯存储键的集合
- 映射模型(map/multimap):存储键值对(key-value pairs)
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. set容器深度解析
2.1 set的核心特性
set是一种不重复的有序集合,具有以下关键特征:
- 元素自动排序(默认升序)
- 元素值唯一(不允许重复)
- 不可直接修改元素(需删除后重新插入)
cpp复制#include <set>
using namespace std;
set<int> mySet = {3, 1, 4, 1, 5}; // 实际存储:1, 3, 4, 5
2.2 set的常用接口详解
2.2.1 插入操作
cpp复制// 插入单个元素
mySet.insert(2); // 成功插入返回pair<iterator, true>
// 插入范围(来自其他容器)
vector<int> vec = {7, 8};
mySet.insert(vec.begin(), vec.end());
// 使用emplace高效构造
mySet.emplace(6); // 避免临时对象构造
2.2.2 查找与统计
cpp复制// 查找元素
auto it = mySet.find(3); // 返回迭代器,未找到返回end()
// 统计元素出现次数(set中只能是0或1)
size_t count = mySet.count(5);
// 范围查找
auto lower = mySet.lower_bound(3); // 第一个>=3的元素
auto upper = mySet.upper_bound(5); // 第一个>5的元素
2.2.3 删除操作
cpp复制// 通过值删除
mySet.erase(4); // 返回删除的元素个数
// 通过迭代器删除
auto it = mySet.find(3);
if (it != mySet.end()) {
mySet.erase(it);
}
// 删除范围
mySet.erase(mySet.begin(), mySet.find(5)); // 删除[begin,5)区间
2.3 set的高级用法
2.3.1 自定义排序规则
cpp复制struct CaseInsensitiveCompare {
bool operator()(const string& a, const string& b) const {
