How to Remove Duplicate Elements from Vector in C++ using std::unique?


Removing duplicate elements and only keeping the unique items in an array (or vector, list) is easy. We can use std::unique method from STL.

The std::unique (from algorithms header) has the following signature:

1
2
3
4
5
template<class ForwardIt>
ForwardIt unique(ForwardIt first, ForwardIt last);
 
template<class ForwardIt, class BinaryPredicate>
ForwardIt unique(ForwardIt first, ForwardIt last, BinaryPredicate p);
template<class ForwardIt>
ForwardIt unique(ForwardIt first, ForwardIt last);

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

Example C++ code to use std::unique to remove duplicate numbers from vector

It requires the vector to be sorted. Here is an example use:

1
2
3
4
5
6
7
vector <int> arr = {1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5};
auto it = std::unqiue(begin(arr), end(arr));
// now arr becomes: {1, 2, 3, 4, 5, x, x, x, x, x, x}
// x is indeterminate
// then we can trim the array to make a unique
arr.erase(it, end(arr));
// x is now {1, 2, 3, 4, 5}
vector <int> arr = {1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5};
auto it = std::unqiue(begin(arr), end(arr));
// now arr becomes: {1, 2, 3, 4, 5, x, x, x, x, x, x}
// x is indeterminate
// then we can trim the array to make a unique
arr.erase(it, end(arr));
// x is now {1, 2, 3, 4, 5}

The std::unique function will return the iterator that is beyond the last element of the unique array – which can be used later for removing the extra duplicate elements from the C++ list/vector.

C++ Generic Implementations of std::unique using template

Here are two possible implementation of the generic std::unique method:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
template<class F>
F unique(F first, F last)
{
    if (first == last) {
        return last;
    }
    F res = first;
    while (++first != last) {
        if (!(*res == *first) && ++ res != first) {
            *res = std::move(*first);
        }
    }
    return ++ res;
}
 
template<class F, class BinaryPredicate>
F unique(F  first, F last, BinaryPredicate p)
{
    if (first == last) {
        return last;
    }
    F res = first;
    while (++first != last) {
        if (!p(*res, *first) && ++res != first) {
            *result = std::move(*first);
        }
    }
    return ++res;
}
template<class F>
F unique(F first, F last)
{
    if (first == last) {
        return last;
    }
    F res = first;
    while (++first != last) {
        if (!(*res == *first) && ++ res != first) {
            *res = std::move(*first);
        }
    }
    return ++ res;
}

template<class F, class BinaryPredicate>
F unique(F  first, F last, BinaryPredicate p)
{
    if (first == last) {
        return last;
    }
    F res = first;
    while (++first != last) {
        if (!p(*res, *first) && ++res != first) {
            *result = std::move(*first);
        }
    }
    return ++res;
}

–EOF (The Ultimate Computing & Technology Blog) —

GD Star Rating
loading...
336 words
Last Post: The Union Find (Disjoint Set) Implementation in Java/C++
Next Post: HPZ800 Server Does Not Support Hard Drives Larger Than 2TB

The Permanent URL is: How to Remove Duplicate Elements from Vector in C++ using std::unique?

Leave a Reply