Namespaces
Variants

std::deque<T,Allocator>:: erase

From cppreference.net

(1)
iterator erase ( iterator pos ) ;
(C++11まで)
iterator erase ( const_iterator pos ) ;
(C++11以降)
(constexprはC++26以降)
(2)
iterator erase ( iterator first, iterator last ) ;
(C++11まで)
iterator erase ( const_iterator first, const_iterator last ) ;
(C++11以降)
(constexprはC++26以降)

コンテナから指定された要素を削除します。

1) pos の要素を削除します。
2) 範囲内の要素を削除します [ first , last )

すべてのイテレータと参照は無効化されます。ただし、削除された要素がコンテナの末尾または先頭にある場合は、削除された要素へのイテレータと参照のみが無効化されます。 end() イテレータも無効化されます。ただし、削除された要素がコンテナの先頭にあり、最後の要素が削除されていない場合は除きます。

イテレータ pos は有効かつデリファレンス可能でなければなりません。したがって、 end() イテレータ(有効ではあるがデリファレンス不可能)は pos の値として使用できません。

イテレータ first は、もし first == last の場合、デリファレンス可能である必要はありません:空の範囲の削除は何も行わない操作です。

目次

パラメータ

pos - 削除する要素へのイテレータ
first, last - 削除する要素の範囲を定義するイテレータのペア range
型要件
-
T MoveAssignable でない場合、動作は未定義です。

戻り値

削除された最後の要素に続くイテレータ。

1) pos が最後の要素を参照する場合、 end() イテレータが返されます。
2) 削除前に last == end ( ) であった場合、更新後の end() イテレータが返されます。
もし [ first , last ) が空の範囲であれば、 last が返されます。

例外

T の代入演算子によって例外がスローされない限り、例外をスローしません。

計算量

線形: T のデストラクタの呼び出し回数は削除された要素の数と同じであり、 T の代入演算子の呼び出し回数は、削除された要素より前の要素数と削除された要素より後の要素数の小さい方を超えない。

注記

コンテナ要素を述語に基づいて削除する必要がある場合、コンテナを反復処理して単項 erase を呼び出すのではなく、イテレータ範囲オーバーロードを一般的に std::remove()/std::remove_if() と共に使用して、残りの(削除されない)要素の移動回数を最小限に抑えます — これがerase-removeイディオムです。 std::erase_if() はerase-removeイディオムを置き換えます。 (C++20以降)

#include <deque>
#include <iostream>
void print_container(const std::deque<int>& c)
{
    for (int i : c)
        std::cout << i << ' ';
    std::cout << '\n';
}
int main()
{
    std::deque<int> c{0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
    print_container(c);
    c.erase(c.begin());
    print_container(c);
    c.erase(c.begin() + 2, c.begin() + 5);
    print_container(c);
    // すべての偶数を削除
    for (std::deque<int>::iterator it = c.begin(); it != c.end();)
    {
        if (*it % 2 == 0)
            it = c.erase(it);
        else
            ++it;
    }
    print_container(c);
}

出力:

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

欠陥報告

以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。

DR 適用対象 公開時の動作 正しい動作
LWG 151 C++98 first がデリファレンス可能であることが要求されており、
空の deque をクリアする動作が未定義となっていた
要求されない(
first == last の場合)
LWG 638 C++98 末尾後ろイテレータが無効化されなかった 要素が中央または末尾から削除される場合に
無効化される

関連項目

特定の条件を満たすすべての要素を削除する
(関数テンプレート)
内容をクリアする
(公開メンバ関数)