std::inplace_vector<T,N>::erase
來自 cppreference.com
< cpp | 容器 | inplace_vector
constexpr iterator erase( const_iterator pos ); |
(1) | (C++26 起) |
constexpr iterator erase( const_iterator first, const_iterator last ); |
(2) | (C++26 起) |
從容器中擦除指定元素。
1) 移除 pos 處的元素。
2) 移除範圍
[
first,
last)
中的元素。迭代器(包括 end()
迭代器)以及指向擦除點或之後元素的引用將失效。
迭代器 pos 必須有效且可解引用。因此,end() 迭代器(有效但不可解引用)不能用作 pos 的值。
如果 first == last,迭代器 first 無需可解引用:擦除空範圍是空操作。
目錄 |
[edit] 引數
pos | - | 指向要移除元素的迭代器 |
first, last | - | 定義要移除元素範圍的迭代器對 |
[edit] 返回值
指向最後一個被移除元素之後的迭代器。
1) 如果 pos 指向最後一個元素,則返回 end() 迭代器。
2) 如果在移除前 last == end(),則返回更新後的 end() 迭代器。
如果
[
first,
last)
是空範圍,則返回 last。[edit] 異常
除非 T
的賦值運算子丟擲異常,否則不丟擲。
[edit] 複雜度
線性:呼叫 T
的解構函式的次數與擦除的元素數量相同,呼叫 T
的賦值運算子的次數與擦除後向量中的元素數量相同。
[edit] 注意
當需要根據謂詞擦除容器元素時,與其遍歷容器並呼叫一元 erase
,不如通常使用迭代器範圍過載與 std::remove()/std::remove_if() 來最小化剩餘(未移除)元素的移動次數——這被稱為擦除-移除習語。std::erase_if()
取代了擦除-移除習語。
[edit] 示例
執行此程式碼
#include <inplace_vector> #include <print> int main() { std::inplace_vector<int, 10> v{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; std::println("{}", v); v.erase(v.begin()); std::println("{}", v); v.erase(v.begin() + 2, v.begin() + 5); std::println("{}", v); // Erase all even numbers for (std::inplace_vector<int, 10>::iterator it{v.begin()}; it != v.end();) if (*it % 2 == 0) it = v.erase(it); else ++it; std::println("{}", v); }
輸出
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] [1, 2, 3, 4, 5, 6, 7, 8, 9] [1, 2, 6, 7, 8, 9] [1, 7, 9]
[edit] 參閱
擦除所有滿足特定標準的元素 (函式模板) | |
清除內容 (公有成員函式) |