C++ 인접하는 중복되는 원소 지우기 unique
Notepad96
·2020. 11. 15. 22:30
300x250
1. unique
unique 함수는 algorithm 라이브러리의 포함되어 있다.
unique는 인접하는 중복된 원소를 제거해주는 기능을 한다.
따라서 집합처럼 중복이 존재하지 않는 유일한 원소값만을 가져야 해야 할 경우 이용할 수 있다.
하지만 완전한 제거가 아니며 다음 중복되지 않은 다른 요소로 대체되어 뒤쪽에 붙는다.
따라서 추가적인 작업을 해주어야만 완전히 중복된 원소를 제거해낼 수 있다.
2. 코 드
환경 : Visual studio 2019
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int num = 0;
int main() {
vector<int> v = { 10, 30, 20, 20, 40, 40, 40, 50, 10, 20, 30};
for (int i : v) cout << i << " ";
cout << "\n==================================\n";
// 중복된 원소를 뒤로
auto it = unique(v.begin(), v.end());
for (int i : v) cout << i << " ";
cout << "\n==================================\n";
v.resize(distance(v.begin(), it));
for (int i : v) cout << i << " ";
cout << "\n==================================\n";
sort(v.begin(), v.end());
it = unique(v.begin(), v.end());
//v.resize(distance(v.begin(), it));
v.resize(it - v.begin());
for (int i : v) cout << i << " ";
cout << "\n==================================\n";
}
- 처음 unique 실행 후 결과를 확인하면 연속되며 중복되었던 20과 40은 사라졌지만 뒤에 10, 20, 30이 붙으며 vector의 크기는 변하지 않았다.
하지만 이 unique가 반환해 주는 대체된 값들이 시작 반복자를 이용하여 제거해 줄 수 있다.
맨 뒤에 대체되어 붙기 때문에 시작부터~it 까지 resize 해주면 된다.
여기서 사용한 distance는 두 반복자의 거리를 반환해주며 여기서는 it - v.begin() 과 동일하다.
또한, 인접한 원소뿐만 아니라 중복되는 원소 모두를 제거하고 싶을 경우 정렬을 한번 실행 해준 후
앞과 똑같은 작업을 실행해주면 중복된 원소를 모두 제거할 수 있다.
3. 참 조
300x250
'C++ > STL' 카테고리의 다른 글
C++ 제곱 수, 제곱근 구하기 pow, sqrt, hypot (0) | 2020.11.16 |
---|---|
C++ 값 변경하기 replace (0) | 2020.11.16 |
C++ 문자열 소문자, 대문자 변환 transform (0) | 2020.11.15 |
C++ 값 교환하기 Swap (0) | 2020.11.14 |
C++ vector 범위 초기화 Copy (0) | 2020.11.14 |