std::unordered_set<Key,Hash,KeyEqual,Allocator>::erase
出自 cppreference.com
< cpp | container | unordered set
| (1) | ||
iterator erase( iterator pos ); |
(C++11 起) (至 C++23 止) |
|
| iterator erase( iterator pos ) requires(!std::same_as<iterator, const_iterator>); |
(自 C++23 起) | |
| iterator erase( const_iterator pos ); |
(2) | (C++11 起) |
| iterator erase( const_iterator first, const_iterator last ); |
(3) | (C++11 起) |
| size_type erase( const Key& key ); |
(4) | (C++11 起) |
template< class K > size_type erase( K&& x ); |
(5) | (自 C++23 起) |
從容器中移除指定的元素。剩餘元素的順序會被保留。(這使得在遍歷容器時刪除個別元素成為可能。)
1,2) 移除 pos 位置的元素。若
iterator 與 const_iterator 為同一型別,則僅提供一個多載版本。3) 移除範圍
[first, last) 內的元素,該範圍必須為 *this 中的有效範圍。4) 移除鍵值等同於 key 的元素(若存在)。
5) 移除所有鍵與數值 x 比較為「等價」的元素。此重載僅在 Hash::is_transparent 與 KeyEqual::is_transparent 皆為有效且指明為某型別時,且
iterator 與 const_iterator 皆不能由 K 隱式轉換時,才會參與重載解析。此處假設該 Hash 可用 K 與 Key 兩者型別進行呼叫,且 KeyEqual 為透明的;兩者結合使得在無需建構 Key 例項的情況下即可呼叫此函式。指向被刪除元素的參考與迭代器會失效。其他迭代器與參考則不會失效。
疊代器 pos 必須有效且可取值(dereferenceable)。因此,end() 疊代器(雖然有效,但不可取值)不能作為 pos 的值使用。
目錄 |
[edit] 參數
| pos | - | 指向要移除元素的迭代器 |
| first, last | - | 定義要移除元素範圍的迭代器對 |
| key | - | key 為要移除元素的鍵值 |
| x | - | x 為任何可與鍵進行透明比較並指明要移除元素的數值 |
[edit] 回傳值
1-3) 指向最後被移除元素之後的迭代器。
4) 已移除元素的數量(0 或 1)。
5) 被移除元素的數量。
[edit] 例外
1-3) 不會丟擲例外。
4,5) 任何由
Hash 與 KeyEqual 物件所丟擲的例外。[edit] 複雜度
給定一個 unordered_set 的實例 c
1,2) 平均情況:常數時間,最差情況:c.size()。
4) 平均情況:c.count(key),最差情況:c.size()。
5) 平均情況:c.count(x),最差情況:c.size()。
備註
| 功能測試巨集 | 數值 | 標準 | 功能 |
|---|---|---|---|
__cpp_lib_associative_heterogeneous_erasure |
202110L |
(C++23) | 關聯式容器與無序關聯式容器中的異質刪除(Heterogeneous erasure);重載 (5) |
[edit] 範例
執行此程式碼
#include <unordered_set> #include <iostream> int main() { std::unordered_set<int> c = {1, 2, 3, 4, 1, 2, 3, 4}; auto print = [&c] { std::cout << "c = { "; for (int n : c) std::cout << n << ' '; std::cout << "}\n"; }; print(); std::cout << "Erase all odd numbers:\n"; for (auto it = c.begin(); it != c.end();) { if (*it % 2 != 0) it = c.erase(it); else ++it; } print(); std::cout << "Erase 1, erased count: " << c.erase(1) << '\n'; std::cout << "Erase 2, erased count: " << c.erase(2) << '\n'; std::cout << "Erase 2, erased count: " << c.erase(2) << '\n'; print(); }
可能輸出
c = { 1 2 3 4 }
Erase all odd numbers:
c = { 2 4 }
Erase 1, erased count: 0
Erase 2, erased count: 1
Erase 2, erased count: 0
c = { 4 }缺陷報告
下列更改行為的缺陷報告追溯應用於之前的 C++ 標準。
| DR | 應用於 | 出版時的行為 | 正確的行為 |
|---|---|---|---|
| LWG 2059 | C++11 | 重載 (2) 存在歧義 | 新增重載 (1) |
| LWG 2356 | C++11 | 非等價元素的順序 未被保證保留 |
被要求必須保留 |
[edit] 參見
| 清除內容 (公開成員函式) |