当前位置:实例文章 » 其他实例» [文章]C++进阶—哈希/unordered系列关联式容器/底层结构(一篇文章学习哈希)

C++进阶—哈希/unordered系列关联式容器/底层结构(一篇文章学习哈希)

发布人:shili8 发布时间:2024-12-23 13:46 阅读次数:0

**C++进阶—哈希/unordered系列关联式容器/底层结构**

在 C++ 中,`std::hash_map` 和 `std::unordered_map` 是两种常用的关联式容器,它们都是基于哈希表的。然而,在 C++11 之后,`std::unordered_map` 成为了更推荐的选择,而 `std::hash_map` 已经被标记为过时。

在本文中,我们将深入探讨哈希表的基本概念、底层结构以及 `std::unordered_map` 的实现细节。我们还会提供一些示例代码来帮助理解这些概念。

**哈希表的基本概念**

哈希表是一种基于数组的数据结构,它通过计算一个键值(key)得到一个索引(index),然后将对应的值存储在该索引位置。这种方式可以实现快速查找和插入元素。

哈希表的主要特点是:

* 快速查找:通过计算键值,可以直接找到相应的值。
* 快速插入:新元素可以直接插入到对应的索引位置。

然而,哈希表也有一些缺点,如:

* 冲突:当两个不同的键值计算得到相同的索引时,就会发生冲突。这种情况下,需要进行处理,比如链式存储或开放寻址。
* 空间浪费:如果哈希表过大,可能会导致空间浪费。

**哈希表的底层结构**

哈希表通常由以下几个部分组成:

* **桶数组**(Bucket Array):这是哈希表的主要存储区域,每个桶对应一个索引。
* **链式存储**(Linked List):用于解决冲突问题,新元素会被插入到链式存储中。

在 C++ 中,`std::unordered_map` 使用桶数组作为底层结构。每个桶是一个 `std::unordered_bucket` 对象,它包含一个哈希表和一个链式存储。

**示例代码**

下面是使用 `std::unordered_map` 的示例代码:

cpp#include <iostream>
#include <unordered_map>

int main() {
 std::unordered_map<int, int> map;

 // 插入元素 map[1] =10;
 map[2] =20;
 map[3] =30;

 // 查找元素 auto it = map.find(2);
 if (it != map.end()) {
 std::cout << "Key: " << it->first << ", Value: " << it->second << std::endl;
 }

 return0;
}

在这个示例中,我们创建了一个 `std::unordered_map` 对象,插入了三个元素,然后使用 `find()` 方法查找并输出第二个元素的值。

**总结**

哈希表是一种基于数组的数据结构,它通过计算键值得到索引来实现快速查找和插入。然而,它也有一些缺点,如冲突和空间浪费。在 C++ 中,`std::unordered_map` 使用桶数组作为底层结构,每个桶对应一个索引。

通过理解哈希表的基本概念、底层结构以及 `std::unordered_map` 的实现细节,我们可以更好地使用这些关联式容器来解决实际问题。

其他信息

其他资源

Top