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

  • 时间:2020-10-11 15:17:18
  • 分类:网络文摘
  • 阅读:98 次

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) —

推荐阅读:
5 Things to Know When Starting a Financial Blog  How to Improve the Marketing for Your Online Business  Building an Online Store – What You Need to Do  Independent Digital Media Is Being Shut Down Around the World, a  Using the Windows Hardware Tool to Error Checking and Optimize Y  The Union Find (Disjoint Set) Implementation in Java/C++  How to use the Leetcode’s Mock Interview Overview to Nail   Replace Harddrives when CrystalDiskInfo Shows Caution Health Sta  Finding the Predecessor and Successor Node of a Binary Search Tr  Algorithms to Detect Pattern of Length M Repeated K or More Time 
评论列表
添加评论