c++的hashset讲解

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

c++的hashset讲解
HashSet是C++标准模板库(STL)中的一个容器,用于存储唯一的、无序的元素。

它是通过哈希函数实现的,可以快速地插入、查找
和删除元素。

1.哈希函数:哈希函数将元素映射到集合中的一个位置,这个位
置称为哈希桶。

哈希函数的设计要尽量均匀地将元素分配到不同的桶中,以避免碰撞(即多个元素映射到同一个桶中)。

C++的HashSet使
用了默认的哈希函数,也可以自定义哈希函数。

2.冲突解决:由于不同的元素可能映射到同一个桶,因此需要解
决冲突。

HashSet使用链地址法来处理冲突,即每个桶中存储一个链表,相同哈希桶的元素通过链表连接起来。

当插入一个元素时,先计算其
哈希值,然后根据哈希值找到对应的桶,在链表的末尾插入元素。


找和删除元素时,也需要按照哈希值找到对应的桶,然后在链表中查
找或删除。

3.时间复杂度:HashSet的插入、查找和删除操作的平均时间复杂度是O(1)。

这是因为哈希函数可以将元素均匀地分散到不同的桶中,
使得链表长度保持在较小的范围内。

然而,在极端情况下,所有元素映射到同一个桶中,此时时间复杂度会退化为O(n)。

4.特点:
-唯一性:HashSet中的元素是唯一的,因为相同的元素不会重复插入。

-无序性:HashSet中的元素没有特定的顺序,插入的顺序和存储的顺序可能不同。

-动态扩容:当元素数量超过哈希桶的负载因子时,HashSet会自动扩容(通常为当前容量的两倍),以保持查询效率。

5.使用方法:在C++中,可以通过包含`<unordered_set>`头文件来使用HashSet。

下面是一些常用的HashSet操作示例:-创建HashSet:
```cpp
#include <unordered_set>
std::unordered_set<int> hashSet; //创建一个空的HashSet
-插入元素:
```cpp
hashSet.insert(10); //插入元素10
hashSet.insert(20); //插入元素20
hashSet.insert(30); //插入元素30
```
-查找元素:
```cpp
if (hashSet.find(20) != hashSet.end()) { //判断元素20是否存在
std::cout << "元素20存在" << std::endl;
} else {
std::cout << "元素20不存在" << std::endl;
```
-删除元素:
```cpp
hashSet.erase(30); //删除元素30 ```
-遍历元素:
```cpp
for (int num : hashSet) {
std::cout << num << " ";
}
std::cout << std::endl;
```
-获取元素数量:
```cpp
std::cout << "HashSet中的元素数量为:" << hashSet.size() << std::endl;
```
-清空HashSet:
```cpp
hashSet.clear(); //清空HashSet中的所有元素
```
总之,HashSet是C++中用于存储唯一的、无序的元素的容器。

它是通过哈希函数实现的,具有快速的插入、查找和删除操作,时间复杂度为O(1)。

在实际使用中,需要注意哈希函数的设计以及处理可能的冲突。

相关文档
最新文档