哈希表在 C++ 中最常用的实现就是 std::unordered_map,它底层基于开放寻址或链地址法(主流实现是**分离链表法**),提供平均 O(1) 的插入、查找和删除。它不是标准强制规定实现方式,但所有主流 STL(如 libstdc++、libc++、MSVC STL)都采用**哈希 + 拉链(bucket + linked list)**结构,配合动态扩容和负载因子控制。
每个桶(bucket)是一个指针,指向一条以哈希值相同元素构成的单向链表。关键成员通常包括:
key、value、next 指针(可能还有 hash 值缓存)load_
factor = size / bucket_count
给定 key,流程如下:
std::hash()(key) 得到一个 size_t 类型哈希值(对自定义类型需特化或传 Hash 函数对象)hash_value % bucket_count 算出下标(libstdc++ 实际用更优的 hash_value & (bucket_count - 1),但前提是 bucket_count 是 2 的幂;而实际它用的是质数,所以仍是取模)operator== 比较 key(注意:哈希相等 ≠ key 相等,必须二次判断)插入逻辑简述:
size > max_load_factor * bucket_count,触发 rehash:分配新桶数组(更大质数),把所有旧节点重新 hash 插入新表libstdc++ 中 rehash 会将 bucket_count 设为「不小于指定值的最小质数」,质数表是静态预置的(如 11, 23, 47, 97...)。
template, typename Eq = std::equal_to > class simple_unordered_map { struct Node { K key; V value; Node* next; Node(const K& k, const V& v) : key(k), value(v), next(nullptr) {} }; std::vector buckets; size_t _size = 0; float max_load = 1.0f; Hash hasher; Eq equal; size_t hash_index(const K& k) const { return hasher(k) % buckets.size(); } void rehash(size_t new_bucket_count) { std::vectornew_buckets(new_bucket_count, nullptr); for (Node* node : buckets) { while (node) { Node* next = node->next; size_t idx = hasher(node->key) % new_bucket_count; node->next = new_buckets[idx]; new_buckets[idx] = node; node = next; } } buckets.swap(new_buckets); } public: simple_unordered_map() { buckets.resize(11, nullptr); }
V& operator[](const K& k) { size_t idx = hash_index(k); Node*& head = buckets[idx]; for (Node* p = head; p; p = p->next) { if (equal(p->key, k)) return p->value; } // 未找到,插入新节点(头插) Node* newNode = new Node(k, V{}); newNode->next = head; buckets[idx] = newNode; ++_size; if (_size > max_load * buckets.size()) rehash(/*下一个质数*/); return buckets[idx]->value; } ~simple_unordered_map() { for (Node* head : buckets) { while (head) { Node* next = head->next; delete head; head = next; } } }};
基本上就这些。真正工业级实现(如 GCC 的
libstdc++/include/bits/hashtable.h)还涉及内存池、移动语义、迭代器失效规则、const_iterator 支持、emplace 优化等,但骨架一致:哈希分桶 + 链表容错 + 动态扩容。理解这个模型,读源码就不容易迷失在模板嵌套里。
# node
# c++
# 质数
# red
# include
# 指针
# 数据结构
# public
# operator
# 对象
# 链表
# 遍历
# 的是
# 是一个
# 特化
# 迭代
# 就不
# 更大
# 设为
# 仍是
相关文章:
C#怎么使用委托和事件 C# delegate与event编程方法
建站VPS能否同时实现高效与安全翻墙?
制作假网页,招聘网的薪资待遇,会有靠谱的吗?一面试又各种折扣?
制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?
如何在阿里云购买域名并搭建网站?
打鱼网站制作软件,波克捕鱼官方号怎么注册?
网站微信制作软件,如何制作微信链接?
如何通过远程VPS快速搭建个人网站?
详解jQuery中基本的动画方法
如何在西部数码注册域名并快速搭建网站?
建站之星如何一键生成手机站?
如何在企业微信快速生成手机电脑官网?
JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)
宁波免费建站如何选择可靠模板与平台?
网站视频怎么制作,哪个网站可以免费收看好莱坞经典大片?
如何快速搭建高效香港服务器网站?
网站建设设计制作营销公司南阳,如何策划设计和建设网站?
建站VPS推荐:2025年高性能服务器配置指南
小建面朝正北,A点实际方位是否存在偏差?
湖北网站制作公司有哪些,湖北清能集团官网?
昆明网站制作哪家好,昆明公租房申请网上登录入口?
企业网站制作公司网页,推荐几家专业的天津网站制作公司?
Bpmn 2.0的XML文件怎么画流程图
设计网站制作公司有哪些,制作网页教程?
定制建站方案优化指南:企业官网开发与建站费用解析
大学网站设计制作软件有哪些,如何将网站制作成自己app?
如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南
如何获取上海专业网站定制建站电话?
如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?
如何通过西部建站助手安装IIS服务器?
高端建站如何打造兼具美学与转化的品牌官网?
如何用花生壳三步快速搭建专属网站?
矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?
专业商城网站制作公司有哪些,pi商城官网是哪个?
上海网站制作网页,上海本地的生活网站有哪些?最好包括生活的各个方面的?
武汉外贸网站制作公司,现在武汉外贸前景怎么样啊?
建站之星后台密码遗忘或太弱?如何重置与强化?
如何通过.red域名打造高辨识度品牌网站?
专业网站设计制作公司,如何制作一个企业网站,建设网站的基本步骤有哪些?
如何在云指建站中生成FTP站点?
开封网站制作公司,网络用语开封是什么意思?
电商平台网站制作流程,电商网站如何制作?
相亲简历制作网站推荐大全,新相亲大会主持人小萍萍资料?
北京制作网站的公司排名,北京三快科技有限公司是做什么?北京三快科技?
香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧
黑客如何通过漏洞一步步攻陷网站服务器?
外贸公司网站制作,外贸网站建设一般有哪些步骤?
网站制作知乎推荐,想做自己的网站用什么工具比较好?
如何快速上传建站程序避免常见错误?
大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?
*请认真填写需求信息,我们会在24小时内与您取得联系。