remove関数
http://www.geocities.jp/ky_webid/cpp/library/021.html
remove関数で値の削除ができます。
使ってみます。
#include <iostream> #include <vector> #include <algorithm> using namespace std; int main () { vector<int> data; data.push_back(3); data.push_back(4); data.push_back(5); data.push_back(3); data.push_back(6); // 3を削除 remove(data.begin(),data.end(),3); copy(data.begin(),data.end(),ostream_iterator<int>(cout,"\n")); return 0; }
$ main 4 5 6 3 6
なんだかおかしな結果になりましたね。3がひとつ消えてない上に、6が増えちゃってます。
実はremoveというのは実際に値の削除が行われるわけではなく、削除したい値を後続の値で上書きしているだけなのです。
removeの戻り値に新しい終端をあらわすイテレータが返ってくるのでそれを使用しないといけないのです。
#include <iostream> #include <vector> #include <algorithm> using namespace std; int main () { vector<int> data; data.push_back(3); data.push_back(4); data.push_back(5); data.push_back(3); data.push_back(6); // 3を削除 vector<int>::iterator end_it = remove(data.begin(),data.end(),3); copy(data.begin(),end_it,ostream_iterator<int>(cout,"\n")); return 0; }
$ main 4 5 6
うまくいきました。しかしこのやり方だとdata.end()が使えないので怖いですよね。
なので本当に削除する方法があります。
removeで得た終端のポインタから、data.end()のポインタまでを完全に消去させればいいわけですね。
erase関数を使います。
#include <iostream> #include <vector> #include <algorithm> using namespace std; int main () { vector<int> data; data.push_back(3); data.push_back(4); data.push_back(5); data.push_back(3); data.push_back(6); // 3を削除 vector<int>::iterator end_it = remove(data.begin(),data.end(),3); // 本当に削除する data.erase(end_it,data.end()); copy(data.begin(),data.end(),ostream_iterator<int>(cout,"\n")); return 0; }
$ main 4 5 6
これで完璧ですね。