【C++】哈希表:简单易懂的核心讲解(含实战用法)

哈希表(Hash Table)是 C++ 中高效的键值对(key-value)存储结构,核心优势是 插入、查找、删除操作的平均时间复杂度接近 O (1)—— 比数组查找(O (n))、有序容器(如 map,O (log n))快得多,日常开发中常用来解决 “快速查找 / 去重 / 统计” 类问题。

一、先搞懂:哈希表到底是什么?(大白话版)

你可以把哈希表想象成一个 “带编号的快递柜”

  • key(键):快递的 “取件码”(唯一标识);
  • value(值):快递本身(要存储的数据);
  • 哈希函数:把 “取件码”(key)转换成 “柜子编号”(数组索引)的规则;
  • 数组 + 链表 / 红黑树:柜子的存储结构(数组是主体,链表 / 红黑树解决 “多个取件码对应同一个柜子” 的冲突问题)。

举个例子:要存储 “学生学号→学生姓名”,哈希函数可以是 “学号 mod 100”—— 学号 202501 对应柜子 1,学号 202502 对应柜子 2,直接按编号找柜子,不用逐个遍历,这就是 O (1) 效率的核心。

二、C++ 中怎么用哈希表?(重点:STL 容器)

C++ 标准库没有直接叫 “HashTable” 的类,但提供了 2 个核心哈希容器,直接用就行:

容器特点(核心区别)适用场景
unordered_map存储 key-value 对,key 唯一,无序快速查找 / 映射(如字典、缓存)
unordered_set只存储 key,key 唯一,无序快速去重 / 判断元素是否存在

补充:和有序容器的区别

  • map/set 是有序的(基于红黑树),查找效率 O (log n);
  • unordered_map/unordered_set 是无序的(基于哈希表),平均 O (1),但最坏 O (n)(冲突严重时),且内存占用略高。

三、实战代码:3 个最常用场景

场景 1:用 unordered_map 做 “键值映射”(如字典 / 缓存)

比如存储 “单词→释义”,快速根据单词查意思:

cpp

运行

#include <iostream> #include <unordered_map> #include <string> using namespace std; int main() { // 1. 定义哈希表:key=string(单词),value=string(释义) unordered_map<string, string> dict; // 2. 插入元素(3种方式) dict["apple"] = "苹果"; // 直接赋值(最简洁) dict.insert({"banana", "香蕉"}); // insert 函数(键不存在时插入) dict.emplace("orange", "橙子"); // emplace(效率更高,直接构造对象) // 3. 查找元素(核心:快速查找) string key = "apple"; if (dict.find(key) != dict.end()) { // find 返回迭代器,找不到返回 end() cout << key << " → " << dict[key] << endl; // 输出:apple → 苹果 } else { cout << "未找到该单词" << endl; } // 4. 遍历哈希表(无序) for (auto& pair : dict) { // pair.first 是 key,pair.second 是 value cout << pair.first << " : " << pair.second << endl; } // 5. 删除元素 dict.erase("banana"); // 按 key 删除 return 0; } 

场景 2:用 unordered_set 去重 / 判断存在

比如给一个数组去重,或快速判断某个数是否在数组中:

cpp

运行

#include <iostream> #include <unordered_set> #include <vector> using namespace std; int main() { vector<int> nums = {1, 2, 2, 3, 3, 3, 4}; unordered_set<int> unique_nums; // 去重:插入时自动忽略重复 key for (int num : nums) { unique_nums.insert(num); // 最终只存 1,2,3,4 } // 判断元素是否存在 int target = 3; if (unique_nums.count(target)) { // count 返回 0 或 1(key 唯一) cout << target << " 存在" << endl; // 输出:3 存在 } // 遍历去重后的结果 for (int num : unique_nums) { cout << num << " "; // 输出:1 2 3 4(顺序不确定) } return 0; } 

场景 3:用哈希表统计频率(如计数问题)

比如统计字符串中每个字符出现的次数:

cpp

运行

#include <iostream> #include <unordered_map> #include <string> using namespace std; int main() { string s = "hello world"; unordered_map<char, int> freq; // key=字符,value=出现次数 // 统计频率 for (char c : s) { freq[c]++; // 不存在的 key 会自动初始化为 0,再 ++ } // 输出结果 for (auto& pair : freq) { cout << "'" << pair.first << "' : " << pair.second << "次" << endl; } // 部分输出:'h':1次, 'e':1次, 'l':3次, 'o':2次... return 0; } 

四、关键注意点(避坑指南)

  1. key 必须可哈希:C++ 中默认支持的 key 类型:intstringdouble 等基础类型;自定义类型(如结构体)作为 key 时,需要手动重载 == 运算符(判断键是否相等)和提供哈希函数(否则编译器报错)。
  2. 无序性unordered_* 容器的遍历顺序和插入顺序无关,若需要有序,应改用 map/set
  3. 冲突问题:哈希表的效率依赖 “哈希函数的好坏”—— 好的哈希函数能减少 “多个 key 对应同一个索引” 的冲突;STL 已内置优化,日常开发不用手动处理冲突。
  4. 性能权衡:追求极致查找速度、不关心顺序 → 用 unordered_map/unordered_set;需要有序存储、允许略低效率 → 用 map/set

总结

哈希表是 C++ 中 “以空间换时间” 的典范,核心价值是 O (1) 级别的查找 / 插入 / 删除。日常开发中,只要遇到 “键值映射、去重、频率统计” 类问题,优先用 unordered_map 或 unordered_set,简单直接又高效!

Read more

最新电子电气架构(EEA)调研-3

而新一代的强实时性、高确定性,以及满足CAP定理的同步分布式协同技术(SDCT),可以实现替代TSN、DDS的应用,且此技术已经在无人车辆得到验证,同时其低成本学习曲线、无复杂二次开发工作,将开发人员的劳动强度、学习曲线极大降低,使开发人员更多的去完成算法、执行器功能完善。 五、各大车厂的EEA 我们调研策略是从公开信息中获得各大车厂的EEA信息,并在如下中进行展示。 我们集中了华为、特斯拉、大众、蔚来、小鹏、理想、东风(岚图)等有代表领先性的车辆电子电气架构厂商。        1、华为 图12 华为的CCA电子电气架构              (1)华为“计算+通信”CC架构的三个平台                         1)MDC智能驾驶平台;                         2)CDC智能座舱平台                         3)VDC整车控制平台。        联接指的是华为智能网联解决方案,解决车内、车外网络高速连接问题,云服务则是基于云计算提供的服务,如在线车主服务、娱乐和OTA等。 华

By Ne0inhk
Apache IoTDB 架构特性与 Prometheus+Grafana 监控体系部署实践

Apache IoTDB 架构特性与 Prometheus+Grafana 监控体系部署实践

Apache IoTDB 架构特性与 Prometheus+Grafana 监控体系部署实践 文章目录 * Apache IoTDB 架构特性与 Prometheus+Grafana 监控体系部署实践 * Apache IoTDB 核心特性与价值 * Apache IoTDB 监控面板完整部署方案 * 安装步骤 * 步骤一:IoTDB开启监控指标采集 * 步骤二:安装、配置Prometheus * 步骤三:安装grafana并配置数据源 * 步骤四:导入IoTDB Grafana看板 * TimechoDB(基于 Apache IoTDB)增强特性 * 总结与应用场景建议 Apache IoTDB 核心特性与价值 Apache IoTDB 专为物联网场景打造的高性能轻量级时序数据库,以 “设备 - 测点” 原生数据模型贴合物理设备与传感器关系,通过高压缩算法、百万级并发写入能力和毫秒级查询响应优化海量时序数据存储成本与处理效率,同时支持边缘轻量部署、

By Ne0inhk
SQL Server 2019安装教程(超详细图文)

SQL Server 2019安装教程(超详细图文)

SQL Server 介绍) SQL Server 是由 微软(Microsoft) 开发的一款 关系型数据库管理系统(RDBMS),支持结构化查询语言(SQL)进行数据存储、管理和分析。自1989年首次发布以来,SQL Server 已成为企业级数据管理的核心解决方案,广泛应用于金融、电商、ERP、CRM 等业务系统。它提供高可用性、安全性、事务处理(ACID)和商业智能(BI)支持,并支持 Windows 和 Linux 跨平台部署。 一、获取 SQL Server 2019 安装包 1. 官方下载方式 前往微软官网注册账号后,即可下载 SQL Server Developer 版本(

By Ne0inhk