紙媒体で管理するとなくなりがちなのでブログで進捗などを管理することにしました
※殆どの記事は自分自身のためだけにかいています.他人に見せられるレベルには至っていません...

【c++】vectorの重複要素の削除

unique()は配列の長さは変わらないため重複で削除された空きの場所にゴミが入る

#include <bits/stdc++.h>
using namespace std;
void printVector(vector<int> &v){
    for(int i=0;i<v.size();i++){
        cout<<v[i]<<endl;
    }
}
int main()
{
    vector<int> vec;
    vec.push_back(1);
    vec.push_back(2);
    vec.push_back(2);
    vec.push_back(3);
    vec.push_back(3);
    vec.push_back(3);
    printVector(vec);
    unique(vec.begin(),vec.end());
    cout<<"-----------------------"<<endl;
    printVector(vec);
    return 0;
}
/*
1
2
2
3
3
3
-----------------------
1
2
3
3//ゴミ
3//ゴミ
3//ゴミ
*/

あらかじめソートして,vec.erase()で重複部分を消す.
unique(vec.begin(),vec.end())はゴミの前を指している.
そこからvec.end()までのゴミ部分を削除するとうまく重複部分を消すことができる.

#include <bits/stdc++.h>
using namespace std;
void printVector(vector<int> &v){
    for(int i=0;i<v.size();i++){
        cout<<v[i]<<endl;
    }
}
int main()
{
    vector<int> vec;
    vec.push_back(1);
    vec.push_back(2);
    vec.push_back(2);
    vec.push_back(3);
    vec.push_back(3);
    vec.push_back(3);
    printVector(vec);
    sort(vec.begin(),vec.end());//ソート
    vec.erase(unique(vec.begin(),vec.end()),vec.end());
    cout<<"-----------------------"<<endl;
    printVector(vec);
    return 0;
}
/*
1
2
2
3
3
3
-----------------------
1
2
3
*/

重複していない部分のサイズを取得するには

int* a = unique(vec.begin(),vec.end());//ゴミの手前を指す
int* b = vec.begin();//配列の先頭を指す
cout<<a-b<<endl;//重複していないサイズ