1

SGI の STLhash_setからクラスから存在しないキーを消去しようとするとどうなりますか? への呼び出しは、最初にキーを見つけてから削除しようとしますか?hash_set::erase

4

1 に答える 1

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のドキュメントから:

Erase key : キーが k と同じ要素をすべて破棄し、a から削除します。戻り値は、消去された要素の数、つまり a.count(k) の古い値です。

于 2013-05-03T08:27:24.137 に答える