什么是哈希集合(unordered_set)?
unordered_set 是 C++ 标准库中的一种容器,它基于 哈希表(Hash Table) 实现。它的特点是:
-
元素唯一:不会存储重复的值
-
快速查找:可以在平均 O(1) 的时间内判断一个元素是否存在于集合中
-
无序:元素存储的顺序与插入顺序无关
unordered_set 非常适合用于需要快速查找和去重的场景
unordered_set 的基本用法
要使用 unordered_set,需要包含头文件 <unordered_set>。以下是它的常用操作:
1. 定义和初始化
#include <unordered_set>
using namespace std;
unordered_set<int> mySet; // 定义一个存储 int 类型的 unordered_set
2. 插入元素
使用 insert 方法向集合中插入元素:
mySet.insert(10); // 插入元素 10
mySet.insert(20); // 插入元素 20
mySet.insert(30); // 插入元素 30
3. 查找元素
使用 find 方法查找元素是否存在于集合中:
if (mySet.find(20) != mySet.end()) {
cout << "20 存在于集合中" << endl;
} else {
cout << "20 不存在于集合中" << endl;
}
-
find方法返回一个迭代器。如果元素存在,迭代器指向该元素;如果元素不存在,迭代器等于mySet.end()
4. 删除元素
使用 erase 方法删除集合中的元素:
mySet.erase(20); // 删除元素 20
5. 遍历集合
可以使用范围循环(C++11 及以上)或迭代器遍历集合:
// 使用范围循环
for (int num : mySet) {
cout << num << " ";
}
// 使用迭代器
for (auto it = mySet.begin(); it != mySet.end(); it++) {
cout << *it << " ";
}
6. 获取集合大小
使用 size 方法获取集合中元素的个数:
cout << "集合大小: " << mySet.size() << endl;
7. 清空集合
使用 clear 方法清空集合:
mySet.clear(); // 清空集合
示例代码:统计相反数的对数
以下是使用 unordered_set 解决统计相反数对数问题的完整代码:
#include <iostream>
#include <unordered_set>
using namespace std;
int main() {
int n;
cin >> n;
int a[500]; // 存储输入的整数
for (int i = 0; i < n; i++) {
cin >> a[i];
}
unordered_set<int> numSet; // 定义哈希集合
int cnt = 0; // 计数器,记录相反数的对数
for (int i = 0; i < n; i++) {
// 检查当前数的相反数是否在集合中
if (numSet.find(-a[i]) != numSet.end()) {
cnt++; // 找到一对相反数
}
// 将当前数插入集合
numSet.insert(a[i]);
}
cout << cnt;
return 0;
}
代码解释:
-
输入处理:
-
读取整数
n,表示数组的长度 -
读取
n个整数并存储在数组a中
-
-
哈希集合
numSet:-
用于存储已经遍历过的数
-
-
查找相反数:
-
遍历数组中的每个数
a[i],检查-a[i]是否在集合中 -
如果存在,则说明找到了一对相反数,计数器
cnt加 1
-
-
插入当前数:
-
将当前数
a[i]插入集合中,以便后续查找
-
-
输出结果:
-
输出找到的相反数的对数
-
示例运行:
输入:
5 1 2 3 -1 -2
输出:
2
解释:
-
1和-1是一对相反数 -
2和-2是一对相反数 -
总共有 2 对相反数
unordered_set 的优点:
-
快速查找:平均时间复杂度为 O(1)
-
自动去重:集合中不会存储重复的元素
-
简单易用:提供了丰富的接口,如
insert、find、erase等
注意事项:
-
无序性:
unordered_set中的元素是无序的,如果需要有序集合,可以使用set -
哈希冲突:虽然哈希表的平均时间复杂度是 O(1),但在极端情况下(如大量哈希冲突),性能会下降
总结:
-
unordered_set是一个基于哈希表的容器,适合用于快速查找和去重的场景 -
它的基本操作包括插入、查找、删除和遍历
-
在解决统计相反数对数的问题中,
unordered_set可以显著提高效率
1662

被折叠的 条评论
为什么被折叠?



