新增时
if( newTotalsize > curBucketNum)
{
找到能容纳newTotalsize 的最近的桶个数__n
if(__n > curBucketNum)
{
则重新分配桶。 并复制旧桶中所有元素。
}
}
即,假设当前桶个数为53. 当前总元素是96个。 要插入一个时变为97, 进入第一个if。97个总元素时, 最近的桶个数__n也是97ul > curBucketNum, 进入第二个if;
将当前桶数从53扩张到97.
类似, 当总元素达到193时继续扩展到桶数为193.
元素的所在桶的下标计算方式是 hash(key)%curBucketNum。 stl中的hash_map只能加一把锁、 加多把锁会出现错误【在同时插入可能引起扩张时。】。
自实现的hash_map可以考虑多把锁。
static const unsigned long __stl_prime_list[_S_num_primes] =
{
53ul, 97ul, 193ul, 389ul, 769ul,
1543ul, 3079ul, 6151ul, 12289ul, 24593ul,
49157ul, 98317ul, 196613ul, 393241ul, 786433ul,
1572869ul, 3145739ul, 6291469ul, 12582917ul, 25165843ul,
50331653ul, 100663319ul, 201326611ul, 402653189ul, 805306457ul,
1610612741ul, 3221225473ul, 4294967291ul
};
inline unsigned long
__stl_next_prime(unsigned long __n)//找到小于且最接近__n的质数。
{
const unsigned long* __first = __stl_prime_list;
const unsigned long* __last = __stl_prime_list + (int)_S_num_primes;
const unsigned long* pos = std::lower_bound(__first, __last, __n);
return pos == __last ? *(__last - 1) : *pos;
}