[C++] unique

2023. 7. 8. 21:32CS

1. unique()

 

unique는 중복되는 요소를 제거하고 나머지 요소들은 삭제하지 않고 그대로 둔다.

 

중복되지 않는 요소 중 마지막 요소 다음 이터레이터를 반환한다.

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

vector<int> v;
int main(){
    for(int i=1; i<=5; i++){
        v.push_back(i);
        v.push_back(i);
    }
    for(int i : v) cout << i << " ";
    cout << endl;

    auto it = unique(v.begin(), v.end());
    cout << it - v.begin() << endl; // 중복되지 않는 요소의 수

    for(int i : v) cout << i << " ";
    cout << endl;

    for(auto cnt = v.begin(); cnt < it; cnt++){
        cout << *cnt << " ";
    }
    cout << endl;

    return 0;
}

/*
1 1 2 2 3 3 4 4 5 5
5
1 2 3 4 5 3 4 4 5 5
1 2 3 4 5
*/
  • cout << it - v.begin() << endl; : 중복되지 않는 요소의 수

 

 

일반적으로 원하는 결과를 위해서는 미리 정렬되어 있어야 한다.

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

//iterator erase (const_iterator first, const_iterator last);
int main(){
    vector<int> s {4, 3, 3, 5, 1, 2, 3};
    s.erase(unique(s.begin(), s.end()), s.end());
    for(int i : s) cout << i << " ";
    cout << endl;

    vector<int> s2 {4, 3, 3, 5, 1, 2, 3};
    sort(s2.begin(), s2.end());
    s2.erase(unique(s2.begin(), s2.end()), s2.end());
    for(int i : s2) cout << i << " ";
    cout << endl;

    return 0;
}
/*
4 3 5 1 2 3
1 2 3 4 5
*/
  • s.erase(unique(s.begin(), s.end()), s.end());
    : unique의 리턴값에서부터 end까지 erase.
    : 하지만 sort를 하지않았기 때문에 3이 두 개인 것을 알 수 있음.
  • sort(s2.begin(), s2.end());, s2.erase(unique(s2.begin(), s2.end()), s2.end());
    : 정상적으로 동작함.

 

vector<int> s {4, 3, 3, 5, 1, 2, 3};
sort(s2.begin(), s2.end());
s2.erase(unique(s2.begin(), s2.end()), s2.end());

unique를 정상적으로 수행하기 위해서는 위의 방식을 기억해 두자.

 


'CS' 카테고리의 다른 글

[C++] lower_bound & upper_bound  (0) 2023.07.09