读书人

为什么hash_map无法使用初始化的bucke

发布时间: 2012-02-21 16:26:23 作者: rapoo

为什么hash_map无法使用初始化的bucket?
hash_map <const int, foo, hash <int> , compare_int > hmap(100);
初始了100个buckets,从内存分配过程上看这个hmap也申请了一块内存。
但是执行
hmap[1]=foo;时,发现又再分配新的内存,根本没有使用到事前申请的那一块。

分析hash_map的源代码后发现,插入新的对像执行的是以下代码
const size_type __n = _M_bkt_num(__obj);
_Node* __first = (_Node*)_M_buckets[__n];
__fisrt是取得的以前的buckts

下面的for是判断有无相同的KEY,
for (_Node* __cur = __first; __cur; __cur = __cur-> _M_next)
if (_M_equals(_M_get_key(__cur-> _M_val), _M_get_key(__obj))) {
_Node* __tmp = _M_new_node(__obj);
__tmp-> _M_next = __cur-> _M_next;
__cur-> _M_next = __tmp;
++_M_num_elements._M_data;
return iterator(__tmp, this);
}
如果是没有相同的KEY值,无论bucket用完否,都是执行这一句,分配一个新的内存节点。
_Node* __tmp = _M_new_node(__obj);
__tmp-> _M_next = __first;
_M_buckets[__n] = __tmp;
++_M_num_elements._M_data;
return iterator(__tmp, this);

在STLport SGI的源代码是,都是这样的。
请问STL高手这是怎么回事呢?

[解决办法]
看《STL源码剖析》吧,你对bucket的理解恐怕有问题。
P253
[解决办法]
bucket只是每个相同hash值的链表表头。所以bucket的数目只决定hash性能,和节点分配无关。
只要hash_map需要插入一个节点(当出现一个新的key时),就会分配一块节点内存,所以没有办法通过调用hash_map的接口事先分配的。
如果必须事先分配,可以考虑为它专门写一个alloc类,并设置为模版参数。hash_map将使用这个类来为节点分配内存,从而使你有机会修改内存分配策略。

读书人网 >C++

热点推荐