2024
11.26

C++에서 중복 요소 제거하는 방법은 크게 두 가지가 있다.

 

1. set 자료구조를 활용

set에 모든 요소를 넣은 후,

for문을 돌리면서 하나씩 vector에 넣는 방법.

#include <set>
#include <vector>

vector<int> main() {
    vector<int> vec = {4, 1, 2, 2, 3, 1, 4, 3};

    // std::set을 사용하여 중복 제거
    set<int> mySet(vec.begin(), vec.end());

    // 중복 제거된 결과를 벡터에 저장
    vector<int> mySet(mySet.begin(), mySet.end());

    return result;
}

 

2. std::unique를 활용

<algorithm> 헤더에 있는 STL을 활용하는 방법이다.

std::unique는 주의해야 하는 중요한 특징이 두 가지 있다.

1. 연속된 중복 요소만 처리한다.

    - { 1, 3, 1, 3 } 의 경우 연속되지 않기 때문에 별다른 처리가 없다.

    - { 1, 1, 3, 3 } 의 경우 중복요소들에 대해 처리한다.

    따라서 모든 중복요소를 처리하고 싶다면 sort를 실행한 다음에 std::unique를 사용하자.

 

2. 중복된 요소를 삭제하는게 아니라, 정렬만 해준다는 특징이 있다.

    - { 1, 1, 3, 3 } 의 경우 { 1, 3, 3, 3 } 이 반환된다. 

    따라서 처리한 후에는 뒤쪽 값을 삭제하도록 하자

template< class ForwardIt >
ForwardIt unique( ForwardIt first, ForwardIt last );

 

vector에 대해 사용하면 중복을 제거한 요소들을 앞쪽에 배치하고, 

반환값으로는 새로운 끝 위치 (=쓰레기 값의 첫 위치) 를 반환한다. 

중복 요소를 제거한 다음에는 vector의  erase 멤버함수를 사용해서 지우도록 하자

#include <vector>
#include <algorithm>

vector<int> main() {
    std::vector<int> vec = {1, 2, 2, 3, 4, 4, 4, 5};

    // unique는 중복을 제거한 뒤의 새로운 끝 위치를 반환
    auto new_end = std::unique(vec.begin(), vec.end());

    // 컨테이너를 크기 조정
    vec.erase(new_end, vec.end());
    
	return vec; // 결과 반환
}