読者です 読者をやめる 読者になる 読者になる

C++と色々

主にC++やプログラムに関する記事を投稿します。

STLコンテナの要素の削除方法

シーケンスコンテナ(vector, string, deque)とlistと連想コンテナ(set, map, 以下略)、の3つに分けて整理します。
"c"は、その時のコンテナのインスタンスを表します。std::を省略しています。完全なコードではありません。

特定の値を削除したい時

・シーケンスコンテナ

c.erase(remove(c.begin(), c.end(), 100), c.end());//100は削除したい要素

・リスト

c.remove(100);//100は削除したい要素

・連想コンテナ

c.erase(100);//100は削除したい要素

特定の述語を満たす要素を削除したい時

"cond"は述語関数を表します。

・シーケンスコンテナ

c.erase(remove_if(c.begin(), c.end(), cond), c.end());

・リスト

c.remove_if(cond);

・連想コンテナ

2通りあり、remove_copy_ifとswapを使う方法(コーディング簡単)と、後置インクリメント(効率が良い)を使う方法です。

前者。"t"は"c"と同型の空のコンテナです。

remove_copy_if(c.begin(), c.end(), inserter(t, t.end()), cond);
c.swap(t);

後者

for (auto i = c.begin(); i != c.end(); )
{
    if (cond(*i))
    {
        c.erase(i++);
    }
    else
    {
        ++i;
    }
}

特定の値を削除し、何らかの処理を挟みたい時

挟みたい処理をfunc()とします。

・シーケンスコンテナ

for (auto i = c.begin(); i != c.end(); )
{
    if(cond(*i))
    {
        func();
        i = c.erase(i);
    }
    else
    {
        ++i;
    }
}

・連想コンテナ

for (auto i = c.begin(); i != c.end(); )
{
    if (cond(*i))
    {
        func();
        c.erase(i++);
    }
    else
    {
        ++i;
    }
}

リストはシーケンスコンテナと同様に書きます。

参考
Effective STL