【C++】哈希容器

unordered系列关联式容器

        在之前的博文中介绍过关联式容器中的map与set,同map与set一样,unordered_set与unordered_set也是关联式容器。

        在C++98中,STL提供了底层为红黑树结构的一系列关联式容器,查询效率可以达到logN;在C++11中,STL又提供了4个unordered系列的关联式容器,这四个容器与红黑树结构的关联式容器的使用方法类似,但是其底层的实现不同。

        unordered_map与unordered_set的底层实现都是哈希表。unordered关联容器与其他关联容器的区别是:

  • unordered是单项迭代器
  • unordered遍历出来的数据不是有序的
  • unordered_set只能去重。不可以用于排序
  • unordered_map也不可以用于排序
  • 无序数据可以使用unordered关联容器具有优势,有序数据使用其他容器较快。

unordered_map的介绍

unordered_map的文档介绍

std::unordered_map

  1. unordered_map是存储< key,value >键值对的关联式容器,其允许通过keys快速的索引到与其对应的value。
  2. 在unordered_map中,键值通常用于唯一地标识元素,而映射值是一个对象,其内容与此键关联。键和映射值的类型可能不同。
  3. 在内部,unordered_map没有对< key,value >按照任何特定的顺序排序,为了可以在常数范围内找到key所对应的value,unordered_map将相同哈希值的键值对放在相同的桶中。
  4. unordered_map容器通过key访问单个元素要比map快,但它通常在遍历元素子集的范围迭代器方面效率较低。
  5. unordered_map实现了直接访问操作符operator[ ],它允许使用key作为参数直接访问value。
  6. unordered_map的迭代器至少是前向迭代器。

unordered_map的接口说明

unordered_map的构造 

函数说明 功能介绍
unordered_map 构造不同格式的unordered_map的对象

unordered_map的容量

函数说明 功能介绍
bool empty() const noexcept;
检测unordered_map是否为空
size_type size() const noexcept;
获取unordered_map的有效元素个数

unordered_map的迭代器

函数说明 功能介绍
begin 返回unordered_map第一个元素的迭代器
end 返回unordered_map最后一个元素下一个位置的迭代器
rbegin 返回unordered_map第一个元素的const迭代器
rend 返回unordered_map最后一个元素下一个位置的const迭代器

unordered_map的元素访问

函数说明 功能介绍
operator[] 返回与key对应的value,没有一个默认值

【注意】:该函数实际上调用了哈希桶的插入操作,用参数

### C++ 中的哈希容器概述 C++ 标准模板库(STL)提供了多种基于哈希表实现的数据结构,这些数据结构被称为 **哈希容器**。它们的主要特点是通过键值快速查找元素,时间复杂度通常为 O(1),这使得它们非常适合处理大规模数据集。 #### 一. `unordered_set` 的基本概念与使用方法 `unordered_set` 是一种不存储重复元素的集合容器,其内部采用哈希表实现[^1]。由于它是无序的,因此无法保证元素按照特定顺序排列。以下是它的主要特点: - 不允许存储重复元素。 - 提供常数级别的平均时间复杂度用于插入、删除和查找操作。 - 迭代器是单向的,这意味着只能向前遍历而不能回退。 下面是一个简单的代码示例展示如何使用 `unordered_set`: ```cpp #include <iostream> #include <unordered_set> int main() { std::unordered_set<int> uset; // 插入元素 uset.insert(10); uset.insert(20); uset.insert(30); // 查找元素 if (uset.find(20) != uset.end()) { std::cout << "Element found!" << std::endl; } // 删除元素 uset.erase(20); return 0; } ``` --- #### 二. `unordered_map` 的基本概念与使用方法 `unordered_map` 是一种关联容器,它将键映射到对应的值上,同样基于哈希表实现。它的特性如下: - 键唯一,不允许有重复键。 - 支持高效的插入、删除和查找操作。 - 和 `unordered_set` 类似,迭代器也是单向的。 以下是一段演示 `unordered_map` 使用方式的代码: ```cpp #include <iostream> #include <unordered_map> int main() { std::unordered_map<std::string, int> umap; // 插入键值对 umap["apple"] = 5; umap["banana"] = 8; // 访问元素 std::cout << "Number of apples: " << umap["apple"] << std::endl; // 修改元素 umap["apple"] += 3; // 遍历所有键值对 for (const auto& pair : umap) { std::cout << pair.first << ": " << pair.second << std::endl; } return 0; } ``` --- #### 三. 哈希容器与其他 STL 容器的区别 相比于传统的有序容器(如 `set` 和 `map`),哈希容器具有以下几个显著区别[^2]: | 特性 | `set/map` | `unordered_set/unordered_map` | |---------------------|--------------------|------------------------------| | 数据存储顺序 | 按照排序规则存储 | 无固定顺序 | | 平均时间复杂度 | O(log n) | O(1) | | 是否支持自定义比较函数 | 支持 | 不支持 | 需要注意的是,虽然哈希容器的时间性能更优,但在某些场景下可能需要考虑冲突解决机制以及内存开销等问题。 --- #### 四. 自定义哈希函数与冲突解决 当默认的哈希函数不足以满足需求时,可以为 `unordered_set` 或 `unordered_map` 提供自定义的哈希函数。例如,对于复杂的对象类型,可以通过重载 `std::hash` 来指定计算逻辑。 ```cpp struct MyStruct { int id; }; namespace std { template <> struct hash<MyStruct> { size_t operator()(const MyStruct& s) const { return hash<int>()(s.id); // 使用成员变量作为哈希依据 } }; } int main() { std::unordered_set<MyStruct> mySet; mySet.emplace(MyStruct{1}); return 0; } ``` ---
评论 113
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值