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

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

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

推荐阅读:
Blogging Magnates and Their Incredible Wealth  Join this Niche: Inspirational Charitable and Non-Profit Blogs  7 Passive Income Ideas to Complement Your Blog  Funny YouTuber Creates Device to Shoot Facemasks To Your Face  YouTube’s New “Viewer Applause” Feature Provides Revenue for Blo  Taiwanese Instagram Grandparents Prove Blogging and Social Media  These Incredible Hologram Machines Could Change the Vlogging Gam  Prepare All Keyboard Warriors: A TikTok and Twitter Merger is Ab  Content Creation Platforms That Pay in Crypto  How to be like Elon Musk: An Influencer CEO 
评论列表
添加评论