unique()函数作用是“去掉”容器中相邻元素的重复元素,然后返回指向第一个重复元素的迭代器。unique()实质上是一个伪去除,它并不是真正把重复的元素删除,而是用不重复的元素把重复的元素覆盖了,所以总长度其实是不变的。

因此在利用unique()函数前需要对容器内的数据排序,可以通过sort()函数实现。sort()函数的作用是对容器指定范围内的元素按指定格式进行排序,默认从小到大。

在利用unique()函数后需要擦除从返回的迭代器对于的元素到最后元素的所有的元素,可以通过erase()函数实现。erase()函数的作用是擦除容器指定范围内的元素。

另外需要说明的是:

  • sort()函数的头文件为:#include <algorithm>
  • unique()函数的头文件为:#include <iostream>
  • erase()函数为容器对象自身的操作,包含头文件:#include <vector>   即可
  • 一般情况下,三个函数均只需要传入两个参数(两个迭代器/地址,且左闭右开)。

综上:主要思路为,先排序,再唯一,最后删除最后面的那段“重复”元素。

举例:

先构造这样一个vector

int construct[10] = {1, 3, 6, 4, 7, 2, 3, 4, 8, 9};
    vector<int> goal(construct, construct+10);        // 1, 3, 6, 4, 7, 2, 3, 4, 8, 9

①首先将vector排序

sort(goal.begin(), goal.end());                    // 1, 2, 3, 3, 4, 4, 6, 7, 8, 9

②然后使用unique算法,unique返回值是重复元素的开始位置

auto pos = unique(goal.begin(), goal.end());    // 1, 2, 3, 4, 6, 7, 8, 9, 3, 4
                                         //                       ^

③最后删除后面的那段重复部分

goal.erase(pos, goal.end());                    // 1, 2, 3, 4, 6, 7, 8, 9

完整代码:

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main()
{
    int construct[10] = {1, 3, 6, 4, 7, 2, 3, 4, 8, 9};
    vector<int> goal(construct, construct+10);        // 1, 3, 6, 4, 7, 2, 3, 4, 8, 9
    sort(goal.begin(), goal.end());                    // 1, 2, 3, 3, 4, 4, 6, 7, 8, 9
    auto pos = unique(goal.begin(), goal.end());    // 1, 2, 3, 4, 6, 7, 8, 9, 3, 4
    goal.erase(pos, goal.end());                    // 1, 2, 3, 4, 6, 7, 8, 9
    for(int it : goal)
        cout << it << ' ';
    return 0;
}

另外对于一些容器中数据类型,如结构体、类等,为了实现去重操作,还可以通过对sort算法需要重载“<”操作符、对unique算法需要重载“==”操作符,通过对其中的某一成员变量进行操作来实现。

对vector的去重操作还可以利用set容器的特性实现,思路比较简单,在此不再说明,直接用代码举例如下:

#include <iostream>
#include <algorithm>
#include <vector>
#include <set>
using namespace std;
int main()
{
    int construct[10] = {1, 3, 6, 4, 7, 2, 3, 4, 8, 9};
    vector<int> goal(construct, construct+10);        // 1, 3, 6, 4, 7, 2, 3, 4, 8, 9
    set<int> temp(goal.begin(), goal.end());           // 1, 2, 3, 4, 6, 7, 8, 9
    goal.assign(temp.begin(), temp.end());            // 1, 2, 3, 4, 6, 7, 8, 9
    for(int it : goal)
        cout << it << ' ';
    return 0;
}

注意:通过上述两种方法得到的结果均为排序后的结果。

STL之vector去重三步曲(利用unique函数)相关推荐

  1. php批量评价,彻底杜绝 WordPress 批量垃圾评论留言的三步曲

    本文将详细介绍如何采取三步曲彻底告别烦人的 WordPress 批量垃圾评论问题,还你一个干净清爽的后台评论区. 刚开始使用 WordPress 程序建站的朋友们肯定或多或少都被其批量垃圾评论困扰过. ...

  2. 【Visual C++】游戏开发笔记三十四 浅墨DirectX提高班之三 起承转合的艺术:Direct3D渲染五步曲...

    本系列文章由zhmxy555(毛星云)编写,转载请注明出处. 文章链接: http://blog.csdn.net/zhmxy555/article/details/8223965 作者:毛星云(浅墨 ...

  3. Membership三步曲之入门篇 - Membership基础示例

    Membership 三步曲之入门篇 - Membership基础示例 Membership三步曲之入门篇 -  Membership基础示例 Membership三步曲之进阶篇 -  深入剖析Pro ...

  4. 【Visual C 】游戏开发笔记三十四 浅墨DirectX提高班之三 起承转合的艺术 Direct3D渲染五步曲

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 本系列文 ...

  5. 管理Linkedin账号三步曲,高效管理领英账号。

    管理Linkedin账号三步曲 Linkedin是全球职业社交平台,全球有6亿用户,中国有5000+万用户.而且这些用户大多是公司的管理层或高层,在公司有很大的决策权.正是这些庞大的用户群体和高质量的 ...

  6. 软件测试职业发展三步曲之一

    软件测试职业发展三步曲之一    --软件测试职业发展方向          作者:叶赫华          天地玄黄,宇宙洪荒:所谓光阴似箭,因为一转眼滚滚的历史车轮就将人类文明推 进了二十一世纪的 ...

  7. 软件测试职业发展三步曲之一 - 软件测试职业发展方向

    天地玄黄,宇宙洪荒:所谓光阴似箭,因为一转眼滚滚的历史车轮就将人类文明推进了二十一世纪的信息时代!葛大爷有对白曰:"二十一世纪最宝贵的是什么?"对曰:"人才!" ...

  8. 【Visual C++】游戏开发笔记三十四 浅墨DirectX提高班之三 起承转合的艺术 Direct3D渲染五步曲

    本系列文章由zhmxy555(毛星云)编写,转载请注明出处. 文章链接: http://blog.csdn.net/zhmxy555/article/details/8223965 作者:毛星云(浅墨 ...

  9. 【Visual C++】游戏开发笔记三十四 浅墨DirectX提高班之三 起承转合的艺术:Direct3D渲染五步曲

    本系列文章由zhmxy555(毛星云)编写,转载请注明出处. 文章链接: http://blog.csdn.net/zhmxy555/article/details/8223965 作者:毛星云(浅墨 ...

  10. IPv6改造三步曲——Vecloud

    Pv6(Internet Protocol Version 6),即互联网协议第6版,是全球公认的下一代互联网解决方案,能够提供更广泛的互联网连接,促进物联网.工业互联网.人工智能等新应用.新领域不断 ...

最新文章

  1. ZedGraph给LineChart添加数值
  2. Spring基础知识及入门
  3. Java的多线程和线程池的使用,你真的清楚了吗?
  4. 详解k8s deployment的滚动更新
  5. Python 字符串 String 内建函数大全(1)
  6. MaxCompute跨境访问加速解决方案
  7. 获取当天日期、昨天日期
  8. ssas脚本组织程序_脚本调试编辑
  9. 机器学习-吴恩达-笔记-13-大规模机器学习
  10. py获取前端的参数_Python小工具系列(3)之参数检查
  11. web测试app测试接口测试要点整理--最全
  12. dex2jar工具及问题
  13. 项目云台控制页面(仿遥控器)
  14. 数字转换成汉语中人民币的大写(javascript正则)
  15. 电力系统服务器是什么,什么是电网调度?
  16. excel表格打印每页都有表头_表格很长,如何使打印出来的每张纸上都有固定的表头?...
  17. 微信小程序之callout自定义气泡
  18. 国赛数模2017B思路汇总第一部分(题目一)
  19. jQuery使用ajaxSubmit()提交表单以及AjaxSubmit的一些用法
  20. Linux——操作系统安装

热门文章

  1. Android中如何Hook住JNI方法
  2. python基础篇--从零开始(下)
  3. php 打乱数组的顺序,php数组打乱顺序
  4. python时间处理方法_基于python时间处理方法(详解)
  5. c语言鸡蛙问题用while,C语言第3章课件.ppt
  6. java怎么根据编号修改数据类型_Java中怎么根据不同的输入数据类型调用不同的方法呢?...
  7. 全国计算机信息大赛noi,全国青少年信息学竞赛NOI系列赛事汇总
  8. oracle 数据库 查看 目录,如何查看oracle数据库服务器名
  9. delphi 热成像摄像机源代码_红外热成像技术广泛应用于夜间及恶劣气候下目标的监控...
  10. 前牙正常覆盖是多少_深覆合千万不要矫正?用图示告诉你深覆合深覆盖的区别是什么,有什么危害...