How to Remove Duplicate Elements from Vector in C++ using std::u
- 时间:2020-10-11 15:17:18
- 分类:网络文摘
- 阅读:126 次
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) —
推荐阅读:求AB两站的路程 小玲和小聪收集各种卡片 三种水果共有多少千克 汽车比原计划早到1.5小时到达目的地 果园里有桔子树和梨树共360棵 原来定价时所期望的利润是多少元? 男生人数的40%比女生人数的一半还多3人 某工厂一、二车间共360人 将侧面积是94.2平方厘米的圆柱拼成一个近似的长方体 公交车共有多少张座位?
- 评论列表
-
- 添加评论