C++的文档中说,STL中的unique是类似于这样实现的:

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

仔细一看就知道,它并不是帮你直接把一个数组中所有重复的元素除去,而是对数组扫描一次,只看当前元素和前面一个元素,如果当前值和前面的值相等,那么跳过,否则就把这个值算上,迭代器递增,最后返回给你一个位置,表示我扫描到多少个当前值与其前面一个元素值不同的元素。

所以,要真正利用好unique,我们必须先对我们所需要进行unique操作的数组排序,然后再使用unique。

这样以后其实还是不满足我们的要求的,因为实际上unique函数实现的只是把不同的元素“unique”放到数组的前面,而数组的后面还有一段重复的没有去掉。这个时候就可以利用到unique函数的返回值啦,它返回的就是重复元素出现的第一个位置。

另外,unique函数可以接受两个参数(数组的开头,数组的末尾),也可以接受三个参数(数组的开头,数组的末尾,两个元素的比较(即定义怎样算元素相等))

看一下实例吧:

  1. // resizing vector
  2. #include <iostream>
  3. #include <vector>
  4. #include <algorithm>
  5. using namespace std;
  6.  
  7. bool myfunction (int i, int j) {
  8. return (i==j);
  9. }
  10.  
  11. int main () {
  12. int myints[] = {,,,,,,,,}; // 10 20 20 20 30 30 20 20 10
  13. vector<int> myvector (myints,myints+);
  14. vector<int>::iterator it;
  15.  
  16. it = unique (myvector.begin(), myvector.end()); // 10 20 30 20 10 ? ? ? ?
  17. //尖所指即it的位置 // ^
  18.  
  19. myvector.erase( it , myvector.end() ); // 第一种去掉末尾的方法
  20.  
  21. cout << "first: myvector contains:";
  22. for (int i=;i<myvector.size();i++)
  23. cout << " " << myvector[i];
  24. cout<<endl;
  25.  
  26. sort(myvector.begin(),myvector.end()); //先排序
  27.  
  28. it = unique (myvector.begin(), myvector.end(), myfunction);
  29. // 使用比较函数,但此处是跟缺省的比较一样的。
  30.  
  31. myvector.resize( it - myvector.begin() ); // 10 20 30
  32.  
  33. cout << "second: myvector contains:";
  34. for (it=myvector.begin(); it!=myvector.end(); ++it)
  35. cout << " " << *it;
  36. cout << endl;
  37.  
  38. return ;
  39. }
  40.  
  41. /*
  42. 输出:
  43. first: myvector contains: 10 20 30 20 10
  44. second: myvector contains: 10 20 30
  45. */

STL Algorithms 之 unique的更多相关文章

  1. C++ STL算法系列 unique

    类属性算法unique的作用是从输入序列中“删除”所有相邻的重复元素. 该算法删除相邻的重复元素,然后重新排列输入范围内的元素,并且返回一个迭代器(容器的长度没变,只是元素顺序改变了),表示无重复的值 ...

  2. C++STL中的unique函数解析

    一.总述 unique函数属于STL中比较常用函数,它的功能是元素去重.即”删除”序列中所有相邻的重复元素(只保留一个).此处的删除,并不是真的删除,而是指重复元素的位置被不重复的元素给占领了(详细情 ...

  3. 数据离散化 ( 以及 stl 中的 unique( ) 的用法 )+ bzoj3289:Mato的文件管理

    http://blog.csdn.net/gokou_ruri/article/details/7723378 ↑惯例Mark大神的博客   bzoj3289:Mato的文件管理 线段树求逆序对+莫队 ...

  4. STL中的unique()和lower_bound ,upper_bound

    unique(): 作用:unique()的作用是去掉容器中相邻元素的重复元素(数组可以是无序的,比如数组可以不是按从小到大或者从大到小的排列方式) 使用方法:unique(初始地址,末地址): 这里 ...

  5. STL中的unique和unique_copy函数

    一.unique函数 这个函数的功能就是删除相邻的重复元素,然后重新排列输入范围内的元素,并返回一个最后一个无重复值的迭代器(并不改变容器长度). 例如: vector<); ; i < ...

  6. C++STL中的unique函数

    头文件:#include<iostream> 函数原型:iterator unique(iterator it_1,iterator it_2); 作用:元素去重,即”删除”序列中所有相邻 ...

  7. STL中map与hash_map容器的选择收藏

    这篇文章来自我今天碰到的一个问题,一个朋友问我使用map和hash_map的效率问题,虽然我也了解一些,但是我不敢直接告诉朋友,因为我怕我说错了,通过我查询一些帖子,我这里做一个总结!内容分别来自al ...

  8. stl——vector详解

    stl——vector详解 stl——vector是应用最广泛的一种容器,类似于array,都将数据存储于连续空间中,支持随机访问.相对于array,vector对空间应用十分方便.高效,迭代器使ve ...

  9. Effective STL 阅读笔记: Item 4 ~ 5: Call empty instead of checking size() against zero.

    Table of Contents 1 Item 4: Call empty instead of checking size() against zero 2 Item 5: Prefer rang ...

随机推荐

  1. hdu 4778 Gems Fight! 状压dp

    转自wdd :http://blog.csdn.net/u010535824/article/details/38540835 题目链接:hdu 4778 状压DP 用DP[i]表示从i状态选到结束得 ...

  2. Linux 环境下思源黑体字体与 Java 之间的兼容性问题的解决(补充说明)

    在前一篇随笔中,我讲了一下有关 Linux 环境下思源黑体与 Java 之间的兼容性问题,后来经过测试发现,默认安装的思源黑体字体同时包含简体字体和繁体字体,并且其对应的语言编码也是不同的.尝试着把繁 ...

  3. How to Upgrade PIP in Windows

    https://datatofish.com/upgrade-pip/ 这个网站写的非常的全

  4. 还在为不停build 烦恼么?看这里~~

    如果你是一名开发者,还在为偶尔改一个坐标或者颜色值 就要重新build 好久,然后如果层次深 还要一步步进去看效果么?下面 为大家介绍一个很好的开源库  DYCI  他的github地址,首先下载到本 ...

  5. Linux服务器同步网络时间

    Linux服务器运行久时,系统时间就会存在一定的误差,一般情况下可以使用date命令进行时间设置,但在做数据库集群分片等操作时对多台机器的时间差是有要求的,此时就需要使用ntpdate进行时间同步. ...

  6. Android Studio 2.0 Beta 5公布,修复几个与即时执行相关的严重BUG.

    Android Studio 2.0 Beta 5公布,修复几个与即时执行相关的严重BUG. This build fixes a couple of important bugs related t ...

  7. BUPT复试专题—中位数(2014-2)

    题目描述 给定一个长度为N的非降数列,求数列的中位数.中位数:当数列的项数N为奇数吋,处于中间位置的变最值即为中位数:当N 为偶数时,中位数则为处于中间位置的两个数的平均数.   输入 输入数据第一行 ...

  8. BUPT复试专题—串查找(?)

    https://www.nowcoder.com/practice/a988eda518f242c29009f8620f654ede?tpId=67&tqId=29642&rp=0&a ...

  9. [ACM] ZOJ 3725 Painting Storages (DP计数+组合)

    Painting Storages Time Limit: 2 Seconds      Memory Limit: 65536 KB There is a straight highway with ...

  10. 使用RPi-Monitor监控、统计Guitar的运行状态

    前言 之前发在ickey社区上的一系列文章: 犹抱琵琶半遮面,无人知是荔枝来--unboxing & interview 一.二.三 葡萄美酒夜光杯,巧妇难为无米炊--资料与社区 一支穿云箭, ...