VS2010 STL hashmap(二)
re,
size_type _Bucket)
{ // fix iterators after inserting _Plist before _Where
if (_Vec_lo(_Bucket) == end())
// 插入空桶
{ // make bucket non-empty
_Vec_lo(_Bucket) = _Plist;
_Vec_hi(_Bucket) = _Plist;
}
else if (_Vec_lo(_Bucket) == _Where)
// 元素插到桶头
_Vec_lo(_Bucket) = _Plist; // move beginning back one element
else if (++_Vec_hi(_Bucket) != _Plist) // move end up one element
// 如果插入到桶尾,则直接把桶尾++
// 否则则桶尾恢复
--_Vec_hi(_Bucket); // or not
}
表扩充流程,其实就是所有当前元素的重新插入过程:
[cpp]
// 进行表扩充
void _Check_size()
{ // grow table as needed
if (max_load_factor() < load_factor())
#if _HAS_INCREMENTAL_HASH
_Grow(); // too dense, need to grow hash table
#else /* _HAS_INCREMENTAL_www.2cto.comHASH */
{ // rehash to bigger table max_size() / 2;
size_type _Newsize = bucket_count();
for (int _Idx = 0; _Idx < 3 && _Newsize < _Maxsize; ++_Idx)
_Newsize *= 2; // multiply safely by 8
_Init(_Newsize);
_Reinsert(end());
}
#endif /* _HAS_INCREMENTAL_HASH */
}