unordered_set c++使用
时间: 2025-03-16 11:05:34 浏览: 44
### C++中 `unordered_set` 的用法
`unordered_set` 是 C++ STL 提供的一种哈希表实现的关联容器,它允许存储唯一的关键字并提供快速查找功能。与 `set` 不同的是,`unordered_set` 并不对元素进行排序[^3]。
#### 基本特性
- **唯一性**:`unordered_set` 中的每个元素都是唯一的,不允许重复。
- **无序性**:不像 `set` 使用红黑树来保持有序结构,`unordered_set` 利用哈希函数管理数据分布,因此其内部元素是没有固定顺序的。
- **高效查询**:由于基于哈希表设计,平均情况下可以达到 O(1) 时间复杂度的操作性能(如插入、删除和查找)。
以下是关于如何使用 `unordered_set` 的详细介绍:
---
#### 创建与初始化
可以通过多种方式创建和初始化一个 `unordered_set` 对象:
```cpp
#include <iostream>
#include <unordered_set>
using namespace std;
int main(){
// 初始化方法一:通过列表初始化
unordered_set<string> uset1 = {"apple", "banana", "cherry"};
// 初始化方法二:逐个插入元素
unordered_set<int> uset2;
uset2.insert(1);
uset2.insert(2);
uset2.insert(3);
return 0;
}
```
上述代码展示了两种常见的初始化手段——直接赋值以及动态插入[^1]。
---
#### 插入操作
向 `unordered_set` 添加新项非常直观:
```cpp
uset1.insert("grape"); // 单独插入一项
uset1.emplace("orange"); // emplace 和 insert 功能相似,在某些场景下效率更高
```
注意,如果尝试插入已存在的键,则该操作会被忽略而不引发错误。
---
#### 删除操作
移除指定元素也很简便:
```cpp
if (uset1.erase("banana") > 0){
cout << "'banana' was successfully removed." << endl;
} else {
cout << "'banana' does not exist in the set." << endl;
}
```
这里需要注意返回值的意义;成功删除时返回受影响的数量,否则为零。
---
#### 查找操作
检查某个特定值是否存在或者获取迭代器指向目标位置均可轻松完成:
```cpp
auto it = uset1.find("apple");
if(it != uset1.end()){
cout << *it << " found!" << endl;
}else{
cout << "Not Found!" << endl;
}
// 或者更简洁的方式判断存在与否
bool exists = (uset1.count("pear") > 0);
cout << boolalpha << exists << endl;
```
其中 `.find()` 返回对应元素的位置指针,`.count()` 给定关键字计数结果要么是0要么是1因为集合里不会有重复条目。
---
#### 迭代遍历
最后我们来看一下怎样访问整个容器内的所有成员:
```cpp
for(const auto& elem : uset1){
cout << elem << ' ';
}
cout << '\n';
```
此循环语句利用范围基表达式逐一打印出每一个项目名称。
---
#### 性能考量及其他注意事项
尽管大多数时候 `unordered_set` 能够带来接近常量时间级别的存取速度优势,但在极端条件下比如糟糕散列冲突率较高情形下也可能退化至线性扫描级别O(n)[^4]。所以实际应用过程中应当合理选取合适的hash function以优化整体表现效果。
另外值得注意的一点就是虽然两者都属于关联型容器范畴之内但是它们之间存在着本质上的差异即是否有内在次序关系这一点决定了各自适用场合的不同之处。
---
阅读全文
相关推荐


















