关联容器:非常有用,元素的查找和插入都是非常快的,可以看作一个小型数据库。
对于不定序容器,即unordered,哈希表提供了底层的实现。
1 哈希表
当容器容量大于数据数量时,则可以做到一个数据占据一个位置。而对于大量数据来说,这种情况时过于理想、不存在的。故应该考虑一种容器容量小于数据数量时的处理,通过“折射"(取余)的方式放入容器,那就是哈希表。
可以想象,这种操作一定会发生“碰撞”。当发生碰撞时,应该有处理他们的办法。
2 哈希表的构建
当发生碰撞时,当前的方法是Saparate Chaining
,即在buskets vector里串出一根链表,在碰撞处东西较少时,搜索速度依然很快。但链表过长时,要进行"打散"处理:当链表数量比busket数量多时,就进行打散,将busket扩大大约2倍,重新进行排列,即Rehash
。
3 哈希表的实现
模板参数:BashFcn是哈希表的“编号”,即定义了一个对象怎样得到他的编号;ExtractKey为如何从一个类的数据中取出其有用的数据,如pair中取到第二个值;EqualKey为比大小的方式。
private中的数据:3个前面所述模板参数创建出的对象;busket是那个vector;num_element为当前数据的数量。
迭代器需要有能力找到下一个busket,类似deque的控制中心一样,进入下一个busket。cur应该指向一个节点(下图是错误的),如果一个busket走到了尽头,需要用ht进入下一个busket。
4 哈希表的用例
其中对于hash,就是得到其标号。标准库的操作方式为,如果是整数,就使用这个数作为标号,如果是字符型,就用一种特殊的标号方式得到其标号。
得到标号后,将这个标号放进那个busket里面。我们可以通过下面代码看出,最重要的操作是取余操作: