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

时间:2013-05-03 08:18:39

标签: c++ std

当我们尝试从SGI's STL删除hash_set班级中不存在的密钥时会发生什么? 对hash_set::erase的调用是否首先尝试找到密钥然后将其删除?

1 个答案:

答案 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)的旧值。