コンテナの要素を消去する際の選択

これもまた良く忘れるのでメモ。
以下のようにチョイスするのが効率的。

  • 連続メモリコンテナ系(vector, deque, string etc):erase + remove
  • リスト(list):remove
  • 連想コンテナ系(set, map etc):erase

以下例、「1,2,3,3,5」という要素を格納する各コンテナから3のみを削除して出力。

#include <iostream>
#include <algorithm>
#include <vector>
#include <list>
#include <set>
int main()
{
    //適当なコンテナ(vector, list, map)
    std::vector<int> xv;
    xv.push_back(1);
    xv.push_back(2);
    xv.push_back(3);
    xv.push_back(3);
    xv.push_back(5);
    std::set<int>  xs( xv.begin(), xv.end());
    std::list<int> xl(xv.begin(), xv.end());
    //vector(removeで3を消去した後に有効な範囲の末尾を指すイテレータを取得、そこから〜本当の終わりまでをerase)
    xv.erase(std::remove(xv.begin(), xv.end(), 3), xv.end());
    //Listだremoveが効率的
    xl.remove(3);
    //連想コンテナ系だとerase
    xs.erase(3);
    //表示
    struct Show{void operator()(double x){std::cout << x << std::endl;}};
    std::cout << "===== vector =====" << std::endl;
    std::for_each(xv.begin(), xv.end(), Show());
    std::cout << "===== list =====" << std::endl;
    std::for_each(xl.begin(), xl.end(), Show());
    std::cout << "===== set =====" << std::endl;
    std::for_each(xs.begin(), xs.end(), Show());
    return 0;
}

実行結果

===== vector =====
1
2
5
===== list =====
1
2
5
===== set =====
1
2
5