[C++] unique
2023. 7. 8. 21:32ㆍCS
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 |
---|