
哈希表在 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>()(key)</key> 得到一个 size_t 类型哈希值(对自定义类型需特化或传 Hash 函数对象)hash_value % bucket_count 算出下标(libstdc++ 实际用更优的 hash_value & (bucket_count - 1),但前提是 bucket_count 是 2 的幂;而实际它用的是质数,所以仍是取模)operator== 比较 key(注意:哈希相等 ≠ key 相等,必须二次判断)插入逻辑简述:
立即学习“C++免费学习笔记(深入)”;
size > max_load_factor * bucket_count,触发 rehash:分配新桶数组(更大质数),把所有旧节点重新 hash 插入新表libstdc++ 中 rehash 会将 bucket_count 设为「不小于指定值的最小质数」,质数表是静态预置的(如 11, 23, 47, 97...)。
template <typename K, typename V, typename Hash = std::hash<K>, typename Eq = std::equal_to<K>>
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<Node*> buckets;
size_t _size = 0;
float max_load = 1.0f;
Hash hasher;
Eq equal;
<pre class="brush:php;toolbar:false;">size_t hash_index(const K& k) const { return hasher(k) % buckets.size(); }
void rehash(size_t new_bucket_count) {
std::vector<Node*> new_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 优化等,但骨架一致:哈希分桶 + 链表容错 + 动态扩容。理解这个模型,读源码就不容易迷失在模板嵌套里。
以上就是c++++如何实现一个哈希表_c++数据结构unordered_map原理【源码】的详细内容,更多请关注php中文网其它相关文章!
c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号