【hash_map】
STL中的std::map内部使用的是红黑树,红黑树有序,每次操作的复杂度稳定在logN。在<ext/hash_map>中,还有一个__gnu_cxx::hash_map,内部使用的是hash,在hash函数恰当的情况下,可以提供更快的查询速度O(1),如果hash函数很烂,使用hash_map,将会是一个灾难,操作复杂度最坏将到O(N)。
内部原理就是“Hash函数映射 + list解决Conflict”。更多可参考:http://blog.csdn.net/sdhongjun/article/details/4517325
我比较好奇的是 这个vector成员,它的默认大小是多少?以及是否能够预设?是否能够在使用过程中变大?下面将分析。
【hash_map初始大小】
hash_map内部的实现是由<ext/hashtable.h>中的__gnu_cxx::hashtable来完成的。如下图:
vector的大小在hashtable的构造函数中就要指定。如下图:
而hash_map在构造函数中,如果没有人为指定的话,传递的则是100。如下图:
当然hash_map也提供了传递size的构造函数。如下图:
【hash_map是否可以改变大小】
hash_map提供了resize()方法,用于调用hashtable中的resize方法。如下图:
hashtable中的resize方法中,如果新的大小比旧的大,则进行替换。如下图:
那新大小是多少呢?是你设多少就是多少?不是。是第一个大你给的__hint大的素数。
上图可以看到,hashtable有一个选定的素数表,基本是翻倍增长的素数表,用以设置新的大小,置于为什么,我猜是选bucket的时候要%N,如果N是素数那么散列效果会更好吧。
【最后】
hash_table是把以双刄剑,用的好效率很高O(1),用的不好奔着O(N)就去了。