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

これで完璧ですね。