名稱空間
變體
操作

std::inplace_vector<T,N>::erase

來自 cppreference.com
 
 
 
 
constexpr iterator erase( const_iterator pos );
(1) (C++26 起)
constexpr iterator erase( const_iterator first, const_iterator last );
(2) (C++26 起)

從容器中擦除指定元素。

1) 移除 pos 處的元素。
2) 移除範圍 [firstlast) 中的元素。

迭代器(包括 end() 迭代器)以及指向擦除點或之後元素的引用將失效。

迭代器 pos 必須有效且可解引用。因此,end() 迭代器(有效但不可解引用)不能用作 pos 的值。

如果 first == last,迭代器 first 無需可解引用:擦除空範圍是空操作。

目錄

[edit] 引數

pos - 指向要移除元素的迭代器
first, last - 定義要移除元素範圍的迭代器對

[edit] 返回值

指向最後一個被移除元素之後的迭代器。

1) 如果 pos 指向最後一個元素,則返回 end() 迭代器。
2) 如果在移除前 last == end(),則返回更新後的 end() 迭代器。
如果 [firstlast) 是空範圍,則返回 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] 參閱

擦除所有滿足特定標準的元素
(函式模板) [編輯]
清除內容
(公有成員函式) [編輯]