コンテナの要素を消去する際の選択
これもまた良く忘れるのでメモ。
以下のようにチョイスするのが効率的。
- 連続メモリコンテナ系(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