안녕하세요 ~ 깨륵입니다 '▽'/
벡터 세번째 시간이네요ㅎㅎ
이번에는 벡터에서 중복원소를 제거하는 간단한 코드를 가져왔습니다!
한번 보러 가실까요?
혹시 벡터 기본 사용법이 익숙치 않다면 아래 게시물부터 보고 와주세요!
[C++ STL : vector] vector 기본 사용법 - 생성, 참조, 원소 추가 및 삭제
↑↑↑ 이 게시물로 오세요 ↑↑↑
벡터 내 중복 값 지우기
: 벡터 컨테이너를 쓸 때 중복되는 원소들을 제거해야 되는 경우가 있죠?
개인적으로 중복값을 제거하는 데 있어서는 일반 배열보다 벡터가 훨씬 편리하다고 생각합니다!
기본형태
sort(vec.begin(), vec.end());
vec.erase(unique(vec.begin(),vec.end()), vec.end());
먼저 오름차순으로 소팅을 해준 다음, unique 함수의 리턴값부터 vector의 end까지 제거해줍니다(erase)
제대로 중복값을 제거하려면 위와같이 unique함수 호출 전, 정렬과정이 반드시 필요합니다.
왜 제거 전 소팅(정렬)을 하냐구요?
👇🏻 궁금하다면 밑에 더보기를 눌러주세요! 전체 코드도 포함되어 있습니다
구조 설명
먼저 <algorithm>에 정의된 unique 함수는 벡터 내에 중복되는 값을 뒤로 모아줍니다.
다만 인접한 원소들을 차례로 중복검사를 해나가기 때문에, 동 떨어져 있으면 중복되어 있다는 것을 못 알아챕니다 ㅜㅜ
그렇기 때문에 unique를 해주기 앞서, sorting을 하여 같은 값의 원소들을 모아주어야 합니다!
그 다음 unique 함수 호출 시 반환되는 값은 첫번째 중복값의 iterator로,
vec.erase(vec_중복값의_첫번째_iterator, vec.end());
위와같이 되겠죠?
그렇게 뒤로 모아진 중복값들을 모두 지워줘야 하기 때문에, 마지막에 vector의 멤버함수인 erase함수로 감싸주는 겁니다!
전체 코드 예시
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
vector<int> vec;
int arr[] = {7,2,1,2,7,5};
vec.assign(arr, arr+6); //벡터 원소 할당
sort(vec.begin(), vec.end());
vec.erase(unique(vec.begin(), vec.end()), vec.end());
for(int i=0; i<vec.size(); i++)
{
cout<<vec[i]<<'\t';
}
return 0;
}
출력 결과
1 2 5 7
진행과정
아래 코드는 위의 두줄의 코드가 실행되는 동안의 진행과정을 한눈에 보기위해 한줄씩 출력해본 것입니다.
진행 과정 코드
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
void print_vec(vector<int> vec)
{
for(int i=0; i<vec.size(); i++)
{
cout<<vec[i]<<" ";
}
cout<<endl;
}
int main()
{
vector<int> vec;
int arr[] = {7,2,1,2,7,5};
vec.assign(arr, arr+6); //벡터 원소 할당
print_vec(vec);
sort(vec.begin(), vec.end()); //정렬
print_vec(vec);
vector<int>::iterator uit= unique(vec.begin(), vec.end()); //중복원소 (쓰레기값으로 변환 후) 뒤로 보냄
print_vec(vec);
vec.erase(uit, vec.end()); //삭제
print_vec(vec);
return 0;
}
출력 결과
7 2 1 2 7 5
1 2 2 5 7 7
1 2 5 7 7 7
1 2 5 7
좀 더 보기 쉽게 도식화 해보았습니다:D
벡터 내 원소들이 아래의 그림과 같은 양상으로 이동합니다.
저번 소팅 게시물보다 설명을 좀 더 자세하게 해보았는데요!
간단한 코드만 보여주는 게 더 나을라나 모르겠네요ㅜㅜ
의견있으시면 자유롭게 댓글로 남겨주세요!.!
다음에는 더욱 유익한 게시물로 찾아뵙겠습니다ㅎㅎ
이상 깨륵이었습니다🐤
가감없는 피드백 언제나 환영합니다 '▽' /
도움이 되셨다면 댓글과 공감 부탁드려요! ❤️💜
'Programming > C++' 카테고리의 다른 글
[C++ STL : vector] 벡터 정렬(vector sorting) - 오름차순, 내림차순, 사용자 지정 정렬 (0) | 2020.11.19 |
---|---|
[C++ STL : vector] vector 기본 사용법 - 생성, 참조, 원소 추가 및 삭제 (0) | 2020.11.12 |