unordered_set与set
时间: 2025-06-27 20:15:32 浏览: 16
### C++ STL `unordered_set` 和 `set` 的差异
#### 数据结构基础
`std::set` 是基于平衡二叉查找树实现的数据容器,通常红黑树被用于此目的。这使得所有的基本操作(插入、删除和查找)的时间复杂度均为 O(log n)[^3]。
对于 `std::unordered_set` 而言,则是哈希表的一种具体化形式。这意味着其内部通过哈希函数来映射键到桶中存储位置,并且理想情况下提供常数时间性能的操作——即平均情况下的插入、删除以及查找都接近于 O(1),但在最坏的情况下可能会退化至线性时间复杂度 O(n) 如果发生大量冲突的话[^1]。
#### 排序特性
由于 `std::set` 基于有序数据结构构建而成,在迭代遍历时会按照元素值从小到大顺序访问;而 `std::unordered_set` 并不保持任何特定的排列方式,因此当需要按一定次序处理集合中的成员时应选用前者。
#### 自定义类型支持
为了使自定义类型的实例能够作为 `std::unordered_set` 中的关键字工作,用户可能还需要为这些类型定义相应的哈希特化版本。相比之下,只要能重载小于运算符 (`<`) 就可以让大多数对象顺利加入到 `std::set` 当中去。
#### 存储效率优化
在某些编译器实现里,如果分配器或比较谓词是没有状态的对象(比如默认构造的标准库模板),那么它们就不会占用额外的空间。这种空间节省同样适用于无序关联容器如 `std::unordered_set` [^4]。
```cpp
#include <iostream>
#include <set>
#include <unordered_set>
int main() {
// 使用 set 进行升序排序并打印
std::set<int> s{7, 2, 5};
for (const auto& elem : s){
std::cout << elem << ' ';
}
std::cout << "\n";
// 使用 unordered_set 插入相同数值但不会保证输出顺序
std::unordered_set<int> us{7, 2, 5};
for (const auto& elem : us){
std::cout << elem << ' ';
}
return 0;
}
```
阅读全文
相关推荐


















