呼叫unordered_set容器的成員函數clear()可以刪除它的全部元素。成員函數erase()可以刪除容器中和傳入引數的雜湊值相同的元素。另一個版本的erase()函數可以刪除疊代器引數指向的元素。例如,這裡不需要大費周章地來刪除容器中的元素:
std::pair<string, string> person { "John", "Smith"};
auto iter = names.find(person);
if(iter != std::end(names))
names.erase(iter);
erase() 疊代器的引數必須是一個指向容器中元素的、有效的、可解除參照的疊代器,因此需要確保它不是容器的結束疊代器。這個版本的 erase() 函數會返回一個指向被刪除元素的下一個位置的疊代器,如果刪除的是最後一個元素,那麼它就是結束疊代器。
如果 person 物件存在,可以像下面這樣很容易地刪除它:
auto n = names.erase(person);
這個版本的 erase() 會返回一個 size_t 型別的數作為被刪除元素的個數。在這種情況下,這個值只能是 0 或 1,但對於 unordered_multiset 容器來說,這個值可能會大於 1。顯然,如果返回值是 0,那麼容器中肯定沒有這個元素。
儘管最初的範例可能沒什麼用,但當需要刪除一些有特定字元的元素時,可以呼叫 erase() 來刪除疊代器所指向的元素,這是很有用的。假設需要移除 names 容器中名稱以字元 'S' 開始的所有元素,那麼下面這個迴圈就可以實現:
while(true)
{
auto iter = std::find_if(std::begin(names), std::end(names),[](const std::pair<string, string>& pr ){ return pr.second[0] == 'S';});
if(iter == std::end(names))
break;
names.erase(iter);
}
find_if() 演算法的前兩個引數定義了一個元素段的範圍,它會找到這段元素中第一個可以使第三個引數返回 true 的元素,然後返回這個元素的疊代器。斷言的引數必須是從解除參照元素段得到的型別物件。這裡的元素段是 names 容器中的全部元素,它們都是 pair<string, string> 物件,斷言是一個 lambda 表示式,當 pair 的第二個成員的首字母是 'S' 時。當沒有元素使 lambda 返回 true 時,演算法會返回這段元素的結束疊代器。
這裡有另一個版本的 erase(),它可以移除一段元素。下面的語句可以移除除了第一個和最後一個元素之外的所有元素:
auto iter = names.erase(++std::begin(names),--std::end(names));
這個函數的引數是兩個疊代器,它們指定了所刪除元素的範圍。這個函數會返回一個疊代器,它指向最後一個被刪除元素後面的元素。