C++ set&multiset
容器:迭代器、大小以及删除
1. set
容器基础
set
是C++标准模板库(STL)中的一种关联容器,具有以下特点:
- 自动排序:元素插入后会自动按升序排列
- 唯一性:每个元素的值必须唯一(
multiset
允许重复) - 基于红黑树:底层通常用红黑树实现,保证高效查找(O(log n))
2. 基本操作
2.1 包含头文件与声明
#include <set> // 必须包含set头文件
using namespace std;
set<int> setInt; // 声明一个存储int类型的set
2.2 插入元素
使用insert()
方法插入元素:
setInt.insert(5); // 插入元素5
setInt.insert(9); // 插入元素9
// 元素将自动排序:1, 3, 5, 7, 9
2.3 遍历set
使用迭代器遍历set:
for (set<int>::iterator it = setInt.begin(); it != setInt.end(); ++it) {
cout << *it << " "; // 输出:1 3 5 7 9
}
3. 常用成员函数
3.1 容量相关
size()
: 返回元素个数setInt.size(); // 返回当前元素数量
empty()
: 判断是否为空setInt.empty(); // 为空返回true,否则false
3.2 迭代器相关
begin()
/end()
: 返回指向首元素/尾后位置的迭代器rbegin()
/rend()
: 返回反向迭代器// 反向遍历 for (auto rit = setInt.rbegin(); rit != setInt.rend(); ++rit) { cout << *rit << " "; // 输出:9 7 5 3 1 }
4. 元素删除操作
set
提供了多种删除方式,需要特别注意迭代器失效问题。
4.1 删除指定位置的元素
setInt.erase(setInt.begin()); // 删除第一个元素
4.2 删除指定范围的元素
auto itBegin = setInt.begin();
auto itEnd = setInt.begin();
advance(itEnd, 3); // 移动迭代器到第4个元素
setInt.erase(itBegin, itEnd); // 删除前3个元素
4.3 删除指定值的元素
setInt.erase(7); // 删除值为7的元素
4.4 清空整个set
setInt.clear(); // 删除所有元素
5. 重要注意事项
-
迭代器失效:在循环中删除元素时,
erase()
会返回下一个有效的迭代器:for (auto it = setInt.begin(); it != setInt.end(); /* 不在这里++ */) { if (condition) { it = setInt.erase(it); // 正确方式 } else { ++it; } }
-
无resize()方法:
set
和multiset
没有resize()
方法,因为它们的容量是动态管理的。 -
性能考虑:由于基于红黑树实现,插入、删除和查找操作的时间复杂度都是O(log n)。
6. 总结
set
容器是C++中非常有用的有序集合容器,通过本文我们学习了:
- 如何
insert()
元素并自动排序 - 使用迭代器遍历set
- 各种
erase()
删除操作的区别 - 容量查询方法
size()
和empty()
- 在循环中安全删除元素的技巧
掌握这些知识点对于高效使用STL容器至关重要,建议通过实际编码练习加深理解。