본문 바로가기

Programming/C++

[C++ STL : vector] 벡터 중복원소 제거

안녕하세요 ~ 깨륵입니다 '▽'/

벡터 세번째 시간이네요ㅎㅎ

이번에는 벡터에서 중복원소를 제거하는 간단한 코드를 가져왔습니다!

한번 보러 가실까요?

 

혹시 벡터 기본 사용법이 익숙치 않다면 아래 게시물부터 보고 와주세요!

 

[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

벡터 내 원소들이 아래의 그림과 같은 양상으로 이동합니다.

 


저번 소팅 게시물보다 설명을 좀 더 자세하게 해보았는데요!

간단한 코드만 보여주는 게 더 나을라나 모르겠네요ㅜㅜ

의견있으시면 자유롭게 댓글로 남겨주세요!.!

 

다음에는 더욱 유익한 게시물로 찾아뵙겠습니다ㅎㅎ

이상 깨륵이었습니다🐤 


가감없는 피드백 언제나 환영합니다  '▽' /
도움이 되셨다면 댓글과 공감 부탁드려요! ❤️💜