unique関数

http://www.geocities.jp/ky_webid/cpp/library/021.html

連続して重複する値が合った場合、削除してひとつにまとめます。

使ってみます。

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main () {
    vector<int> data;
    
    data.push_back(3);
    data.push_back(3);
    data.push_back(4);
    data.push_back(5);
    data.push_back(6);
    data.push_back(3);
    
    data.erase( unique(data.begin(),data.end()), data.end() );
    
    copy(data.begin(),data.end(),ostream_iterator<int>(cout,"\n"));
    
    return 0;
}
$ main
3
4
5
6
3

しかしこれ、連続して重複した値でないと削除されないってのは微妙ですね・・・。とにかく重複してたら削除とかはできないんでしょうか?

ちなみに配列のユニーク処理であれば以前C言語のときに実装しました。

http://d.hatena.ne.jp/pknight/20090706/1246869623

ということでこれをテンプレート化して再実装してみます。

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

template<class T> T myunique(T begin, T end) {
    int i,j,k;
    int uniq;
    for(j=i=0; begin+i!=end; ++i){
        uniq = 0;
        for(k=0;k<i;k++){
            if ( begin[k] == begin[i] ) {
                uniq = 1;
                break;
            }
        }
        if ( !uniq ) {
            begin[j++] = begin[i];
        }
    }
    return begin+j;
}

int main () {
    vector<int> data;
    
    data.push_back(3);
    data.push_back(3);
    data.push_back(4);
    data.push_back(5);
    data.push_back(6);
    data.push_back(3);
    data.push_back(6);
    
    data.erase( myunique(data.begin(),data.end()), data.end() );
    
    copy(data.begin(),data.end(),ostream_iterator<int>(cout,"\n"));
    
    return 0;
}
$ main
3
4
5
6

うまくいきました。