안녕 세상아,

[c++/벡터] 벡터의 중복 제거 (unique, erase) 본문

c++ 개념

[c++/벡터] 벡터의 중복 제거 (unique, erase)

돈 많은 백수가 되고싶다 2024. 8. 20. 14:14

벡터에서 간단하게 중복을 제거하는 방법이 있다. 

sort의 erase와 unique를 사용하면 된다. 이를 사용하기 위해서는 헤더에 algorithm을 추가해주면 된다. 

 

벡터 하나를 만든 후 중복 숫자를 벡터에 삽입한다. 

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

vector<int> s;

int main()
{
	s.push_back(1);
	s.push_back(2);
	s.push_back(1);
	s.push_back(3);
	s.push_back(2);
	s.push_back(1);
	s.push_back(2);
	
	for(int i=0;i<s.size();i++)
		cout<<s[i]<<endl;
}

이후 unique를 사용하면 그대로 1 2 1 3 2 1 2 이렇게 나온다. 

 

왜? 

 

이유는 unique는 연속된 중복 원소를 vector의 제일 뒷부분으로 쓰레기값으로 보내버리기 때문이다.

 

이를 확인하기 위해 sort를 한 후 보면,

	unique(s.begin(),s.end());	
	for(int i=0;i<s.size();i++)
		cout<<s[i]<<endl;

1 2 3 2 2 2 3 -> 이렇게 나온다. 

 

unique만 하면 중복 제거가 되지 않는다. 

 

중복 제거까지 하려면 erase를 사용해야한다.

	s.erase(unique(s.begin(),s.end()),s.end());
	for(int i=0;i<s.size();i++)
		cout<<s[i]<<endl;

코드를 실행하면 1 2 3 -> 이렇게 나온다. 

 

int 에서만 적용되는 것은 아니고 char에서도 적용이 된다.

'c++ 개념' 카테고리의 다른 글

[c++/알고리즘] 투포인터  (0) 2024.09.21
[c++] 단락 평가  (1) 2024.08.30
[c++] isdigit() (숫자 판별 함수)  (1) 2024.08.05
[c++ 개념] 문자열 -> int (stoi)  (1) 2024.07.29
[c++/알고리즘] 백트래킹 정의, 예시  (0) 2024.05.17