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:
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:
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:
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) —
Last Post: The Union Find (Disjoint Set) Implementation in Java/C++
Next Post: HPZ800 Server Does Not Support Hard Drives Larger Than 2TB