SGI の STLhash_set
からクラスから存在しないキーを消去しようとするとどうなりますか? への呼び出しは、最初にキーを見つけてから削除しようとしますか?hash_set::erase
1910 次
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 に答える