【STL源码剖析】系列十三:关联式容器--unordered-set、unordered-map、unordered-multiset和unordered-multimap
前言
在了解hashtable之后,下面就可学习基于hashtable的set和map。在之前的介绍中,我们直到set和map主要是为了提升查找效率,所以采用红黑树的底层机制,查找效率可以达到O(logn)。但是这是基于元素的随机性。
而对于hashtable而言,不需要基于元素的随机性假设就可以使得元素的存取和删除达到常数级。
本篇主要是介绍基于hashtable实现的set、map、multiset和multimap。虽然这里介绍时采用的是C++11标准之前的hash_set、hash_map、hash_multiset和hash_multimap,但是设计思想是一致的,只是在一些接口上有些许差别。
本篇主要内容:
1.基于hashtable实现的set和map;
2.基于hashtable实现的multiset和multimap。
注:基于hashtable实现的set和map对外接口在hashtable几乎以及实现,因此只需要调用即可,实现细节参考hashtable。本篇基本只是代码注释和简介,会比较枯燥。
【STL源码剖析】系列十二:关联式容器--hashtable
前言
hashtable是实现set和map的另一种底层机制,准确来说,在C++11之后,是实现unordered_set、unordered_map、unordered_multiset和unordered_multimap这四种无序关联式容器的底层机制。
但是由于书中使用的C++编译器是C++11之前的版本,因此这里的解析在C++11标准之前,下面介绍的hashtable与正式标准存在一些差别,比如hash function的差别、C++增加了重映射策略等等。
尽管如此,这里剖析的hashtable在关键设计思想上与新标准一致,比如均使用开链法(链地址法)处理冲突,即使用bucket vector和linked list实现哈希表。
本篇主要内容有:
1.STL中使用链地址法实现hash表;
2.hashtable的迭代器为正向迭代器,递增的实现方式;
3.hashtable的构造与内存管理(插入和重整);
4.hashtable的复制和清除操作。