[C++] 배열의 중복 요소 제거

배열의 요소들 중에 중복 요소를 제거하는 방법을 소개합니다.

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

set는 기본적으로 중복 요소를 허용하지 않는 자료구조입니다. for문을 이용하여 set에 모든 요소를 추가하면, set의 특성에 의해 저절로 중복 요소가 제거됩니다.

#include <iostream>
#include <unordered_set>

int main() {
    int arr[] = {1, 2, 5, 3, 2, 5, 9, 7};
    int n = sizeof(arr) / sizeof(*arr);

    std::unordered_set<int> set;
    for (int i = 0; i < n; i++) {
        set.insert(arr[i]);
    }

    int i = 0;
    int newArr[set.size()];
    for (auto it = set.begin(); it != set.end(); it++) {
        newArr[i++] = *it;
    }

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

    return 0;
}

Output:

7 9 3 5 2 1

2. set를 이용하여 vector의 중복 요소 제거

set를 이용하여 vector의 중복 요소를 제거할 수 있습니다. 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
Loading script...
codechachaCopyright ©2019 codechacha