2013-05-03 36 views
1

當我們試圖從類中刪除不存在的密鑰時,會發生什麼?SGI's STL? 撥打hash_set::erase是否首先嚐試查找密鑰然後刪除它?當我們試圖從hash_set中刪除不存在的密鑰時會發生什麼

+0

實際上取決於數據結構。你在說什麼'hash_set'?標準庫中沒有該類名稱。 – Angew 2013-05-03 08:20:03

+0

什麼是'hash_set'?標準庫中沒有這樣的東西。 – 2013-05-03 08:20:43

+2

您是否在談論C++哈希集的實現:http://www.sgi.com/tech/stl/hash_set.html? – zakinster 2013-05-03 08:23:25

回答

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.count(k)的舊值。

+0

而且,如果找不到密鑰,「沒有」,更重要的是。 – 2013-05-03 08:29:30

+0

所以我不需要檢查包含()擦除之前的密鑰? – user1393608 2013-05-03 08:29:56

+0

@ user1393608,因爲在文檔中指定了這種行爲,這似乎是多餘的。 – zakinster 2013-05-03 08:35:07

相關問題