名前空間
変種
操作

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

From cppreference.com
< cpp‎ | container‎ | list
 
 
 
 
(1)
iterator erase( iterator pos );
(C++11まで)
iterator erase( const_iterator pos );
(C++11以降)
(2)
iterator erase( iterator first, iterator last );
(C++11まで)
iterator erase( const_iterator first, const_iterator last );
(C++11以降)

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

1) pos が指す要素を削除します。
2) [firstlast) の範囲内の要素を削除します。

削除された要素への参照およびイテレータは無効になります。他の参照およびイテレータは影響を受けません。

イテレータ pos は有効で逆参照可能である必要があります。したがって、end() イテレータ(有効ですが逆参照可能ではありません)を pos の値として使用することはできません。

first == last の場合、first を逆参照する必要はありません。空の範囲の削除は何も行いません。

目次

[編集] パラメータ

pos - 削除する要素へのイテレータ
first, last - 削除する要素の範囲を定義するイテレータのペア

[編集] 戻り値

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

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

[編集] 例外

(なし)

[編集] 計算量

1) 定数時間。
2) firstlast の間の距離に対して線形です。

[編集] 注釈

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

[編集]

#include <list>
#include <iostream>
#include <iterator>
 
void print_container(const std::list<int>& c)
{
    for (int i : c)
        std::cout << i << ' ';
    std::cout << '\n';
}
 
int main()
{
    std::list<int> c{0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
    print_container(c);
 
    c.erase(c.begin());
    print_container(c);
 
    std::list<int>::iterator range_begin = c.begin();
    std::list<int>::iterator range_end = c.begin();
    std::advance(range_begin, 2);
    std::advance(range_end, 5);
 
    c.erase(range_begin, range_end);
    print_container(c);
 
    // Erase all even numbers
    for (std::list<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 は逆参照可能であることが要求されていましたが、
これにより、空のlistをクリアする際の動作が未定義になりました。
不要な場合
first == last

[編集] 関連項目

特定の基準を満たすすべての要素を削除する
(関数テンプレート) [編集]
内容をクリアする
(公開メンバ関数) [編集]
English 日本語 中文(简体) 中文(繁體)