当我们尝试从SGI's STL删除hash_set
班级中不存在的密钥时会发生什么?
对hash_set::erase
的调用是否首先尝试找到密钥然后将其删除?
答案 0 :(得分:2)
以下是hash_set
实施所使用的代码,它是hashtable
的擦除方法:
template <class _Val, class _Key, class _HF, class _Ex, class _Eq, class _All>
typename hashtable<_Val,_Key,_HF,_Ex,_Eq,_All>::size_type
hashtable<_Val,_Key,_HF,_Ex,_Eq,_All>::erase(const key_type& __key)
{
const size_type __n = _M_bkt_num_key(__key);
_Node* __first = _M_buckets[__n];
size_type __erased = 0;
if (__first) {
_Node* __cur = __first;
_Node* __next = __cur->_M_next;
while (__next) {
if (_M_equals(_M_get_key(__next->_M_val), __key)) {
__cur->_M_next = __next->_M_next;
_M_delete_node(__next);
__next = __cur->_M_next;
++__erased;
--_M_num_elements;
}
else {
__cur = __next;
__next = __cur->_M_next;
}
}
if (_M_equals(_M_get_key(__first->_M_val), __key)) {
_M_buckets[__n] = __first->_M_next;
_M_delete_node(__first);
++__erased;
--_M_num_elements;
}
}
return __erased;
}
正如您所看到的,它会在删除节点之前尝试找到密钥,如果密钥不存在则不执行任何操作。
另外,来自SGI documentation:
擦除键:销毁其键与k相同的所有元素 从a中删除它们。返回值是元素的数量 被删除的,即a.count(k)的旧值。