当我们试图从hash_set中擦除不存在的键时会发生什么?

What happens when we try to erase non existent key from hash_set

本文关键字:什么 不存在 擦除 我们 hash set      更新时间:2023-10-16

当我们试图从SGI的STL中删除hash_set类中不存在的键时会发生什么?对hash_set::erase的调用是否首先尝试找到密钥然后删除它?

这是您实现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文档:

Erase key:销毁键值与k相同的所有元素从a中移除它们。返回值是元素的个数即a.c recount (k)的旧值。