C++ STL 容器:unordered_map 与 unordered_set 底层结构解析
在深入剖析了 list、map 和 set 的底层实现后,你会发现 unordered_map 和 unordered_set 的封装逻辑其实大同小异。它们都基于哈希表(HashTable)构建,但针对键值对和单一键的场景做了适配。下面我们就来看看这两个容器的核心细节。
1. unordered_map、unordered_set 的基本结构
虽然 unordered_set 存储的是单一键(K-K),而 unordered_map 存储的是键值对(K-V),但在源码层面,它们往往共用同一个哈希表模板实例。unordered_set 对应 <K, K>,而 unordered_map 则对应 <K, pair<K, V>>。
unordered_set 源码示意:
template<class K, class V>
class unordered_set {
struct SetKeyOfT {
const K& operator()(const K& key) { return key; }
};
public:
typedef typename hash_bucket::HashTable<K, K, SetKeyOfT>::const_iterator iterator;
typedef typename hash_bucket::HashTable<K, K, SetKeyOfT>::const_iterator const_iterator;
const_iterator begin() const { return _ht.begin(); }
const_iterator end() const { return _ht.end(); }
pair<const_iterator, bool> insert( K& key) {
pair< hash_bucket::HashTable<K, K, SetKeyOfT>::iterator, > ret = _ht.(key);
<const_iterator, >(ret.first, ret.second);
}
:
hash_bucket::HashTable<K, K, SetKeyOfT> _ht;
};


