C++数据结构--哈希表

本文将深入解析unordered_map在C++中的使用,通过查找、修改和清除操作,探讨如何利用哈希表高效统计DNA序列中重复的子串。重点讲解查找、更新及清理键值对的方法,并以DNA序列分析为例,展示实际应用场景。
  1. 头文件
#include< unordered_map>
  1. 定义
unordered_map<int,int> Hash;  //key和value均为整形
unordered_map<string,int> cnt; //key为string型,value为整形

1) 查找

it=Hash.find(1);  //查找哈希表Hash里是否存在key为1

若找不到,返回的是Hash.end();
2)修改

Hash[1] = 4;   //若Hash里没有key为1,则自动创建key为1的键值;若存在key为1,则自动修改;
Hash[3]++;     //若Hash里没有key为3,则自动创建key为3的键值,并给其赋值为0,在执行++操作,即hash[3]=1;若存在key为3,则自动执行++操作;

3)清除

Hash.erase(1);   //删除键值为1的键对
Hash.clear();   //清除哈希表

例子:

重复的DNA序列

### C++哈希表 `std::unordered_map` 的实现与应用 #### 基本概念 哈希表(Hash Table),又称散列表,是一种通过哈希函数将键映射到特定位置的数据结构[^2]。这种映射使得哈希表能够提供高效的插入、删除和查找操作。在C++标准库中,`std::unordered_map` 是一种常用的哈希表实现。 #### 关键特性 - **快速存取**:哈希表利用哈希函数计算键的索引位置,从而实现了平均时间复杂度为 O(1) 的插入、删除和查找操作。 - **键值对存储**:每项数据都是一组键值对,其中键用于定位数据的位置,而值则是实际要存储的信息。 - **冲突处理**:由于不同键可能被映射到相同的索引位置,因此需要有效的冲突解决机制,如链地址法或开放寻址法。 #### 实现细节 `std::unordered_map` 使用的是基于链地址法的哈希表实现。具体而言: - 当两个不同的键经过哈希函数后得到相同的结果时,这两个键会存储在同一桶(bucket)内的单向链表中。 - 插入新元素时,先计算其哈希码并找到对应桶;如果该桶为空,则直接放入;如果不为空,则加入链表末端。 - 查找元素时,同样根据哈希码定位到相应桶,并沿链表遍历直至匹配成功或者到达链尾为止。 ```cpp #include <iostream> #include <string> #include <unordered_map> int main() { // 创建一个字符串到整数类型的 unordered_map 对象 std::unordered_map<std::string, int> wordCount; // 向 map 添加一些单词计数值 wordCount["apple"] = 3; wordCount["banana"] = 5; // 访问已有的 key-value pair std::cout << "Number of apples: " << wordCount["apple"] << '\n'; // 尝试访问不存在key (这将会创建一个新的 entry) std::cout << "Number of oranges before insertion: " << wordCount["orange"] << '\n'; ++wordCount["orange"]; // 更新 orange 的数量 // 遍历整个 map 打印所有条目 for (const auto& element : wordCount){ std::cout << element.first << ": " << element.second << "\n"; } return 0; } ``` 这段代码展示了如何声明、初始化以及操作 `std::unordered_map` 类型的对象。注意,在尝试读取未存在的键之前,程序不会自动为其分配默认值;只有当首次写入某个不存在的键时才会触发这样的行为。 #### 应用场景 哈希表非常适合于那些频繁涉及查找、更新操作的应用场合,比如缓存系统、编译器符号表管理等。此外,在构建字典类工具软件方面也有着广泛应用,例如上述例子中的英汉词典功能就可以借助 `std::unordered_map` 来高效地完成增删改查任务[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值