C++競プロ学習日記(仮)

( 学習記録であり解説Blogではないです )

std::unique|続・重複要素チェック

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;
}

[Wandbox]三へ( へ՞ਊ ՞)へ ハッハッ

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;
}

[Wandbox]三へ( へ՞ਊ ՞)へ ハッハッ

重複を除いた値だけを参照したい場合は std::unique_copy *2 を使って
back_inserter *3してあげると確認できました。

std::unique隣り合った要素の重複しか除けない為、sort が必須 (おしまい)