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
うまくいきました。