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. 참 조

 
 
 

unique - C++ Reference

function template std::unique equality (1)template ForwardIterator unique (ForwardIterator first, ForwardIterator last); predicate (2)template ForwardIterator unique (ForwardIterator first, ForwardIterator last, BinaryPredicate pred); Remove co

www.cplusplus.com

 

 

300x250