std::unique|続・重複要素チェック|C++
std::unique *1 の挙動にハマったので覚え書き📝
#include <bits/stdc++.h> using namespace std; bool check( vector<int> A ){ sort( begin( A ), end( A ) ); return unique( begin( A ), end( A ) ) == end( A ); } int main() { vector<int> vc1{ 1,1,1,2,3,3,3,1,1,1 }; vector<int> vc2{ 1,2,3 }; cout << "重複:" << ( check( vc1 ) ? "無し" : "有り" ) << endl; for( auto &x : vc1 ) cout << x << " "; cout << endl; cout << "重複:" << ( check( vc2 ) ? "無し" : "有り" ) << endl; for( auto &x : vc2 ) cout << x << " "; return 0; }
std::uniqueを使っても関数に投げてcheckする分には元の要素に変化はない
➡︎ vectorのコピーを関数に渡しているから
#include <bits/stdc++.h> using namespace std; bool check( vector<int> A ){ return unique( begin( A ), end( A ) ) == end( A ); } int main() { vector<int> vc1{ 1,1,1,2,3,3,3,1,1 }; vector<int> vc2{ 1,1,1,2,3,3,3,1,1 }; vector<int> vc3{ 3,2,1 }; sort( begin( vc2 ), end( vc2 ) ); sort( begin( vc3 ), end( vc3 ) ); cout << check( vc1 ) << endl; cout << check( vc2 ) << endl; cout << check( vc3 ) << endl; vector<int> res1, res2, res3; unique_copy( begin( vc1 ), end( vc1 ), back_inserter( res1 ) ); unique_copy( begin( vc2 ), end( vc2 ), back_inserter( res2 ) ); unique_copy( begin( vc3 ), end( vc3 ), back_inserter( res3 ) ); for( auto &x : res1 ) cout << x << " "; cout << endl; for( auto &x : res2 ) cout << x << " "; cout << endl; for( auto &x : res3 ) cout << x << " "; return 0; }
重複を除いた値だけを参照したい場合は std::unique_copy *2 を使って
back_inserter *3してあげると確認できました。
std::uniqueは隣り合った要素の重複しか除けない為、sort が必須 (おしまい)