C++ vector 중복 삭제 방법 예제

C++에서 벡터에 중복 값이 있는 경우 삭제하는 방법을 알아보겠습니다.

벡터에 중복 값을 삭제하는 방법으로는 std::unique와 std::vector::erase을 사용해 중복 값을 삭제할 수 있습니다.

또는 std::set을 사용해 중복 값을 삭제할 수 있습니다.

unique와 erase

unique 함수를 사용해 벡터에 중복된 값을 삭제하는 방법을 알아보겠습니다.

#include <iostream>
#include <vector>
#include <iterator>
#include <iomanip>
#include <algorithm>

using std::cout; using std::endl;
using std::vector; using std::copy;
using std::setw; using std::left;

int main() {
    vector<int> int_vec = {10, 23, 10, 324, 10, 10, 424,
                           649, 110, 110, 129, 40, 424};

    cout << left << setw(10) << "vec: ";
    copy(int_vec.begin(), int_vec.end(),
         std::ostream_iterator<int>(cout,"; "));
    cout << endl;


    std::sort(int_vec.begin(), int_vec.end());
    auto last = std::unique(int_vec.begin(), int_vec.end());
    int_vec.erase(last, int_vec.end());

    cout << left << setw(10) << "vec: ";
    copy(int_vec.begin(), int_vec.end(),
         std::ostream_iterator<int>(cout,"; "));
    cout << endl;


    return 0;
}

결과

vec:      10; 23; 10; 324; 10; 10; 424; 649; 110; 110; 129; 40; 424;
vec:      10; 23; 40; 110; 129; 324; 424; 649;

 

unique 함수로 벡터의 중복 값을 삭제하기 위해서는 sort를 사용해 정렬을 해야 합니다.

정렬한 벡터를 unique를 사용해 중복 값이 시작되는 위치를 취득합니다.

마지막으로 erase 함수로 중복된 값이 시작되는 부분부터 값을 삭제합니다.

 

set

이번에는 set을 사용해 벡터에 중복된 값을 삭제하는 방법을 알아보겠습니다.

#include <iostream>
#include <vector>
#include <iterator>
#include <iomanip>
#include <algorithm>
#include <set>

using std::cout; using std::endl;
using std::vector; using std::copy;
using std::setw; using std::left;
using std::set;

int main() {
    vector<int> int_vec = {10, 23, 10, 324, 10, 10, 424,
                           649, 110, 110, 129, 40, 424};

    cout << left << setw(10) << "vec: ";
    copy(int_vec.begin(), int_vec.end(),
         std::ostream_iterator<int>(cout,"; "));
    cout << endl;


    set<int> int_set(int_vec.begin(), int_vec.end());
    int_vec.assign(int_set.begin(), int_set.end());


    cout << left << setw(10) << "vec: ";
    copy(int_vec.begin(), int_vec.end(),
         std::ostream_iterator<int>(cout,"; "));
    cout << endl;


    return 0;
}

 

결과

vec:      10; 23; 10; 324; 10; 10; 424; 649; 110; 110; 129; 40; 424;
vec:      10; 23; 40; 110; 129; 324; 424; 649;

 

set 컨테이너를 사용해서 벡터의 중복하는 요소를 삭제했습니다.

set을 사용해 중복 요소를 사용하는 경우 오름차순으로 자동으로 정렬이 됩니다.

 

댓글