c++中的哈希集合unordered_set

什么是哈希集合(unordered_set)?

unordered_set 是 C++ 标准库中的一种容器,它基于 哈希表(Hash Table) 实现。它的特点是:

  1. 元素唯一:不会存储重复的值

  2. 快速查找:可以在平均 O(1) 的时间内判断一个元素是否存在于集合中

  3. 无序:元素存储的顺序与插入顺序无关

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;
 }

代码解释:
  1. 输入处理

    • 读取整数 n,表示数组的长度

    • 读取 n 个整数并存储在数组 a

  2. 哈希集合 numSet

    • 用于存储已经遍历过的数

  3. 查找相反数

    • 遍历数组中的每个数 a[i],检查 -a[i] 是否在集合中

    • 如果存在,则说明找到了一对相反数,计数器 cnt 加 1

  4. 插入当前数

    • 将当前数 a[i] 插入集合中,以便后续查找

  5. 输出结果

    • 输出找到的相反数的对数


示例运行:
输入:
 5
 1 2 3 -1 -2
输出:
 2
解释:
  • 1-1 是一对相反数

  • 2-2 是一对相反数

  • 总共有 2 对相反数


unordered_set 的优点:
  1. 快速查找:平均时间复杂度为 O(1)

  2. 自动去重:集合中不会存储重复的元素

  3. 简单易用:提供了丰富的接口,如 insertfinderase


注意事项:
  1. 无序性unordered_set 中的元素是无序的,如果需要有序集合,可以使用 set

  2. 哈希冲突:虽然哈希表的平均时间复杂度是 O(1),但在极端情况下(如大量哈希冲突),性能会下降


总结:
  • unordered_set 是一个基于哈希表的容器,适合用于快速查找和去重的场景

  • 它的基本操作包括插入、查找、删除和遍历

  • 在解决统计相反数对数的问题中,unordered_set 可以显著提高效率

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值