C++中的set
时间: 2025-05-28 07:23:07 浏览: 19
### C++ 中 `set` 的使用方法及特性
#### 1. **基本概念**
`set` 是 C++ 标准模板库(STL)中的关联容器之一,用于存储唯一的、按顺序排列的元素集合。它的底层实现基于红黑树,因此提供了高效的插入、删除和查找操作[^3]。
#### 2. **头文件引入**
要使用 `set`,需要包含 `<set>` 头文件:
```cpp
#include <set>
```
#### 3. **定义方式**
可以通过指定存储的数据类型来创建一个 `set` 对象。以下是几种常见的定义形式:
```cpp
// 存储整数类型的 set
std::set<int> intSet;
// 存储浮点数类型的 set
std::set<double> doubleSet;
// 存储字符串类型的 set
std::set<std::string> stringSet;
```
如果需要自定义比较函数或类,则可以传递额外参数给 `set` 构造函数[^4]。
#### 4. **初始化**
支持多种初始化方式,包括通过大括号列表直接赋值:
```cpp
std::set<int> mySet = {5, 3, 8, 1};
```
注意:即使输入无序,最终存储的结果会按照升序排列[^2]。
#### 5. **常用成员函数**
- 插入元素:
```cpp
mySet.insert(7); // 向 set 中添加新元素
```
- 删除元素:
```cpp
mySet.erase(3); // 移除特定值的元素
```
- 查找元素:
```cpp
auto found = mySet.find(8);
if (found != mySet.end()) {
std::cout << "Element exists!" << std::endl;
}
```
- 判断是否存在某元素:
```cpp
bool containsFive = mySet.count(5) > 0 ? true : false;
```
- 遍历所有元素:
可以利用迭代器或者范围 for 循环完成遍历任务。
```cpp
// 迭代器版本
for(auto it=mySet.begin();it!=mySet.end();++it){
std::cout<<*it<<" ";
}
// 范围 for 版本
for(const auto& elem:mySet){
std::cout<<elem<<" ";
}
```
#### 6. **时间复杂度分析**
由于内部采用了平衡二叉搜索树(通常是红黑树),所以对于 n 个节点的操作平均情况下有如下性能表现:
| 操作 | 时间复杂度 |
|------------|-----------|
| 插入(insert)| O(log n) |
| 删除(erase) | O(log n) |
| 查找(find) | O(log n) |
这使得它非常适合处理动态变化频繁而查询需求较高的场景。
#### 7. **注意事项**
- 所有的键都是独一无二的;尝试向其中加入已存在的键不会改变原有状态也不会引发错误提示[^1]。
- 默认情况下会对所有的项依据小于运算符(<)进行排序;若需其他规则可提供定制化 comparator 参数。
---
### 示例代码展示
下面给出一段综合运用上述特性的简单程序:
```cpp
#include <iostream>
#include <set>
int main(){
std::set<int> numbers={9,-2,4,7};
// 输出原始内容
std::cout<<"Original Set Content:"<<std::endl;
for(int num:numbers){
std::cout<<num<<"\t";
}
std::cout<<std::endl;
// 尝试插入重复数值
numbers.insert(-2);
// 再次打印确认未发生变化
std::cout<<"After Inserting Duplicate Value:"<<std::endl;
for(int num:numbers){
std::cout<<num<<"\t";
}
std::cout<<std::endl;
return 0;
}
```
此例子展示了如何构建并操控一个简单的 integer 类型 sets 结构实例。
---
阅读全文
相关推荐














