[C++] vector의 중복 요소 제거

vector의 중복 요소를 제거하는 방법을 소개합니다.

1. set를 이용하여 중복 요소 제거

set는 기본적으로 중복 요소를 허용하지 않는 자료구조입니다. vector의 모든 요소를 set에 저장하고, 다시 set를 vector로 변경하면 중복 요소를 제거할 수 있습니다.

unordered_set의 생성자에 vector.begin(), vector.end()를 전달하면 vector의 모든 요소가 set에 추가됩니다. 반대로 vector의 생성자에 begin과 end를 전달하면 set의 모든 요소가 vector에 추가됩니다.

#include <iostream>
#include <unordered_set>
#include <vector>

int main() {
    std::vector<int> int_vec = {1, 2, 5, 3, 2, 5, 9, 7};

    // remove duplicates
    std::unordered_set<int> int_set(int_vec.begin(), int_vec.end());

    // set to vector
    std::vector<char> new_vec(int_set.begin(), int_set.end());

    for (const int &i: new_vec) {
        std::cout << i << ' ';
    }

    return 0;
}

Output:

7 9 3 5 2 1

2. std::remove()를 이용하여 중복 제거

std::remove(first, last, val)는 first와 last 범위의 벡터 요소들 중에 val과 일치하는 요소를 제거합니다. for문으로 현재 순회하는 요소가, 다음 요소부터 마지막 요소 사이에 있으면 모두 삭제하도록 합니다.

remove()는 vector의 크기, 즉 container 크기를 줄이지는 않기 때문에 erase()를 이용하여 마지막 삭제된 요소 위치부터 실제 vector의 마지막 위치까지 요소들을 제거해야 합니다.

#include <iostream>
#include <algorithm>
#include <vector>

int main() {
    std::vector<int> int_vec = {1, 2, 5, 3, 2, 5, 9, 7};

    auto end = int_vec.end();
    for (auto it = int_vec.begin(); it != end; ++it) {
        end = std::remove(it + 1, end, *it);
    }
    int_vec.erase(end, int_vec.end());

    for (const int &i: int_vec) {
        std::cout << i << ' ';
    }

    return 0;
}

Output:

1 2 5 3 9 7
Loading script...
codechachaCopyright ©2019 codechacha