具体实现见中间源码
function template
<algorithm>

std::unique

equality (1)
template <class ForwardIterator>
ForwardIterator unique (ForwardIterator first, ForwardIterator last);
predicate (2)
template <class ForwardIterator, class BinaryPredicate>
ForwardIterator unique (ForwardIterator first, ForwardIterator last,
BinaryPredicate pred);
Remove consecutive duplicates in range

Removes all but the first element from every consecutive group of equivalent elements in the range [first,last).



The function cannot alter the properties of the object containing the range of elements (i.e., it cannot alter the size of an array or a container): The removal is done by replacing the duplicate elements by the next element that is not a duplicate, and signaling
the new size of the shortened range by returning an iterator to the element that should be considered its new past-the-end element.



The relative order of the elements not removed is preserved, while the elements between the returned iterator and lastare left in a valid but unspecified state.



The function uses operator== to compare the pairs of elements (or pred, in version (2)).



The behavior of this function template is equivalent to:

1
2
3
4
5
6
7
8
9
10
11
12
13
template <class ForwardIterator>
ForwardIterator unique (ForwardIterator first, ForwardIterator last)
{
if (first==last) return last; ForwardIterator result = first;
while (++first != last)
{
if (!(*result == *first)) // or: if (!pred(*result,*first)) for version (2)
*(++result)=*first;
}
return ++result;
}
 

Parameters

first, last
Forward iterators to the initial and final positions of the sequence of move-assignable elements.
The range used is[first,last), which contains all the elements between first and last, including the element pointed by first but not the element pointed by last.
pred
Binary function that accepts two elements in the range as argument, and returns a value convertible to bool. The value returned indicates whether both arguments are considered equivalent (if true, they
are equivalent and one of them is removed).

The function shall not modify any of its arguments.

This can either be a function pointer or a function object.

Return value

An iterator to the element that follows the last element not removed.

The range between first and this iterator includes all the elements in the sequence that were not considered duplicates.

Example

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
30
31
// unique algorithm example
#include <iostream> // std::cout
#include <algorithm> // std::unique, std::distance
#include <vector> // std::vector bool myfunction (int i, int j) {
return (i==j);
} int main () {
int myints[] = {10,20,20,20,30,30,20,20,10}; // 10 20 20 20 30 30 20 20 10
std::vector<int> myvector (myints,myints+9); // using default comparison:
std::vector<int>::iterator it;
it = std::unique (myvector.begin(), myvector.end()); // 10 20 30 20 10 ? ? ? ?
// ^ myvector.resize( std::distance(myvector.begin(),it) ); // 10 20 30 20 10 // using predicate comparison:
std::unique (myvector.begin(), myvector.end(), myfunction); // (no changes) // print out content:
std::cout << "myvector contains:";
for (it=myvector.begin(); it!=myvector.end(); ++it)
std::cout << ' ' << *it;
std::cout << '\n'; return 0;
}

Output:

myvector contains: 10 20 30 20 10

Complexity

For non-empty ranges, linear in one less than the distance between first and last: Compares each pair of consecutive elements,
and possibly performs assignments on some of them.

Data races

The objects in the range [first,last) are accessed and potentially modified.

Exceptions

Throws if any of pred, the element comparisons, the element assignments or the operations on iterators throws.

Note that invalid arguments cause undefined behavior.

另一个实例:

#include <iostream>

#include <vector>

#include <algorithm>

#include <iterator>

/* 删除容器内重复元素,分三步处理

* 1、先排序容器元素

* 2、取得重复元素首部迭代器

* 3、删除重复元素

*/

using namespace std;



int main()

{

    int a[]={1,2,3,1,2,4,4,5};

    const int len = sizeof(a)/sizeof(int);

    vector<int> va(len);// 定义一个与数组等长的容器

    copy(a, a + len, va.begin());

    ostream_iterator<int, char> oi(cout," ");//定义一个输出流迭代器

    copy(va.begin(), va.end(), oi);

    cout << " 容器内元素顺序输出结果" << endl;

    // sort(两个参数)默认升序排列元素,如果不是基本类型,请重载操作符opearte<.

    // sort (三个参数) sort(va.begin(),va.end(),handle_v);

    // 自己写函数实现处理两个元素参数 bool handle_v(const int & a,cont int & b){};

    sort(va.begin(), va.end());

    vector<int>::iterator it = unique(va.begin(),va.end());

    va.erase(it, va.end());

    copy(va.begin(), va.end(), oi);

    cout << " 删除重复元素后顺序输出结果" << endl;

    return 0;

}

vector去重--unique的更多相关文章

  1. STL 去重 unique

    一.unique函数 类属性算法unique的作用是从输入序列中"删除"所有相邻的重复元素. 该算法删除相邻的重复元素,然后重新排列输入范围内的元素,并且返回一个迭代器(容器的长度 ...

  2. javascript 数组去重 unique

    晚上无事,偶然看到这么个小测试,拿来写一写,希望大家提建议: 直接上代码: Array.prototype.unique = function (isStrict) { if (this.length ...

  3. vector 去重

    1.使用unique函数: sort(v.begin(),v.end()); v.erase(unique(v.begin(), v.end()), v.end()); //unique()函数将重复 ...

  4. Java代码工具箱_用Set给List/Vector去重

    参考 方法一:需要2个容器,1个迭代去重,1个作为结果容器. 此方法其实想法比较简单也是正常思路: package com.yonyou.test; import java.util.List; im ...

  5. LeetCode OJ:Remove Duplicates from Sorted Array(排好序的vector去重)

    Given a sorted array, remove the duplicates in place such that each element appear only once and ret ...

  6. $.unique()去重问题

    var yearArray = new Array(2009, 2009, 2010, 2010, 2009, 2010);$.unique(yearArray); 返回 2009, 2010, 20 ...

  7. vector某元素是否存在、查找指定元素 、去重

    vector.map 判断某元素是否存在.查找指定元素 [C++]判断元素是否在vector中,对vector去重,两个vector求交集.并集 PS:注意重载

  8. C++中unique函数

    目录 介绍 用法举例 数组 vector 介绍 unique是STL比较实用的一个函数.用于"去除"容器内相邻的重复的元素(只保留一个).这里说的去除并不是真正将容器内的重复元素删 ...

  9. vector基础

    //STL基础 //容器 //vector #include "iostream" #include "cstdio" #include "vecto ...

随机推荐

  1. STM32中按键中断分析

    在按键学习中,我们有用到查询的方法来判断按键事件是否发生,这种查询按键事件适用于程序工作量较少的情况下,一旦程序中工作量较大较多,则势必影响程序运行的效率,为了简化程序中控制的功能模块的执行时间,引入 ...

  2. 滑动窗口的最大值 牛客网 剑指Offer

    滑动窗口的最大值 牛客网 剑指Offer 题目描述 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值.例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6 ...

  3. 链表中倒数第K个结点 牛客网 程序员面试金典 C++ Python

    链表中倒数第K个结点 牛客网 程序员面试金典 C++ Python 题目描述 输入一个链表,输出该链表中倒数第k个结点. C++ /* struct ListNode { int val; struc ...

  4. atcoder ABC233

    B 题意 给一个字符串, 可以把第一个字母移到最后, 也可以把最后一个字母放第一个, 问字典序最大最小的字符串. 题解 把第一个放最后一个, 相当于把最后一个放第一个执行n-1次, 那么我们不妨只进行 ...

  5. spring-cloud-square源码速读(spring-cloud-square-okhttp篇)

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  6. 利用Wireshark 解密HTTPS流量

    在我之前的一篇文章中已经介绍了一种解密HTTPS流量的一种方法,大致方法就是客户端手动信任中间人,然后中间人重新封包SSL流量. 文章地址: http://professor.blog.51cto.c ...

  7. Loto实践干货(8) 实测 保险丝 用示波器带电流探头

    本文用LOTO示波器和5A的电流探头来实验两种常见类型的保险丝的保护曲线.一种是熔断型的,另一种是自恢复型的.我们通常需要在一些电路中对电流过大的情况做保护,比如防止用户把输出源短路,比如防止用户对电 ...

  8. vuex配置token和用户信息

    首先设计的是登录成功后端产生token,前端取出放在Local Storage,便于后面每个请求默认带上这里的token以及取用户相关信息 和main.js同级建store.js文件,代码如下 imp ...

  9. sqlalchemy flush commit

    https://segmentfault.com/q/1010000000698181 flush 将sql发送到内存 commit 真正提交

  10. React-Router示例(重定向与withRouter)

    1.withRouter作用:把不是通过路由切换过来的组件中,将react-router 的 history.location.match 三个对象传入props对象上   默认情况下必须是经过路由匹 ...