std::unique

一.总述

  unique函数属于STL中比较常用函数,它的功能是元素去重。即”删除”序列中所有相邻的重复元素(只保留一个)。此处的删除,并不

是真的删除,而是指重复元素的位置被不重复的元素给占领了。由于它”删除”的是相邻的重复元素,所以在使用unique函数之前,一般都

会将目标序列进行排序。

功能:对有序的容器重新排列,将第一次出现的元素从前往后排,其他重复出现的元素依次排在后面

二.函数原型

unique函数的函数原型如下:1.只有两个参数,且参数类型都是迭代器:

iterator unique(iterator it_1,iterator it_2);

这种类型的unique函数是我们最常用的形式。其中这两个参数表示对容器中[it_1,it_2)范围的元素进行去重(注:区间是前闭后开,即不包含it_2所指的元素),返回值是一个迭代器,它指向的是去重后容器中不重复序列的最后一个元素的下一个元素。

有序的容器:

1 1 2 3 3 4 4 4 5 6

unique处理过的容器:

unique unique unique unique unique unique 迭代器指向的地址      
1 2 3 4 5 6 1 3 4 4

三、去重函数unique

头文件:#include <algorithm>

unique的作用就是"去除"数组中重复的元素,unique去重的过程是将重复的元素移到容器的后面去,实际上这种说法并不正确,应该是把不重复的元素移到前面来:


  1. #include <iostream>
  2. #include <algorithm>
  3. using namespace std;
  4. int main()
  5. {
  6. int a[10] = { 0, 7, 7, 6, 1, 1, 5, 5, 8, 9 };
  7. int n = unique(a, a + 10) - a;
  8. cout << n << endl; //7,得到不重复元素的个数;
  9. for (int i = 0; i < 10; i++)
  10. cout << a[i] << " "; //0 7 6 1 5 8 9 5 8 9
  11. return 0;
  12. }

可以看见最后三个元素是:5 8 9,而重复的数字是1 5 7,所以网上这种说法:“unique去重的过程是将重复的元素移到容器的后面去”是不对的。 

上面的n返回的是7,它就是:最后一个不重复数字的下标。 

所以,把上面的for循环改成:


  1. for (int i = 0; i < n; i++)
  2. cout << a[i] << " "; //0 7 6 1 5 8 9

i < n就是只输出前面不重复的数字,这样就实现的去重的效果。

四、去重函数unique与排序函数sort结合

  如果先去重排序那么结果就是:去重毫无作用。因为去重排序排序时会把重复的数字又放在了一起,所以要先排序去重。这点应该好理解,这里就提一下。

排序去重代码如下:


  1. #include <iostream>
  2. #include <algorithm> //sort(), unique()
  3. #include <functional> //less<int>()
  4. using namespace std;
  5. int main()
  6. {
  7. int i;
  8. int a[10] = { 0, 7, 7, 6, 1, 1, 5, 5, 8, 9 };
  9. sort( a, a + 10, less<int>() ); //排序
  10. int n = unique(a, a + 10) - a; //去重
  11. for ( i = 0; i < n; i++) //注意i < n
  12. cout << a[i] << " "; //0 1 5 6 7 8 9
  13. }

于是就得到了想要的结果:先把数字排序,再去掉重复数字。

五,以上便是去重应用于数组的情况:接下来看一下字符串的情况:

uniqe()函数是去掉重复的字符。是指两个字符连续出现就只留下一个,其余的就删除。例如:

 string s("hello,world");

 string::iterator iterEnd=unique(s.begin(),s.end());     //返回出现重复元素的迭代器位置

这代码执行后,s的值为helo,worldd. 只消除连续出现的同样的字符。重点是不连续的不消除。

unique函数通常和erase函数一起使用,来达到删除重复元素的目的。(注:此处的删除是真正的删除,即从容器中去除重复的元素,容器

的长度也发生了变换;而单纯的使用unique函数的话,容器的长度并没有发生变化,只是元素的位置发生了变化)

还有一个就是unqiue()函数删除重复的字符后,字符串长度不变,所以如果字符串删除字符后,后面按照之前的值填上。 所以就是helo,worldd,而不是helo,world;

所以就会有一个函数erase()函数存在的必要性了。它可以删除字符。

s.erase(iterEnd,s.end());      //删除掉重复元素;

执行后s的值就是我们想要的helo,world.

如果想要只留下一个字符l,只能先排序!!!!让他们挨在一块。

sort()函数是排序字符串字符。 即如果是akjsc,排序后为acjks.

所以一般用unique函数的时候都会用到erase(). sort()用到也也比较多。

六,总结:


  1. #include <iostream>
  2. #include <algorithm> //sort(), unique()
  3. #include <functional> //less<int>()
  4. #include<string>
  5. using namespace std;
  6. int main()
  7. {
  8. /////////////////字符串的去重排序
  9. string str = "sjscncmkzmxkz";
  10. sort(str.begin(), str.end()); //先对字符串排序;
  11. string::iterator itend = unique(str.begin(), str.end()); //返回出现重复元素的首地址;
  12. cout << str << endl;
  13. str.erase(itend, str.end()); //删除重复元素;
  14. cout << str << endl;
  15. ////////////数组的去重排序;
  16. int a[10] = { 0, 7, 7, 6, 1, 1, 5, 5, 8, 9 };
  17. sort(a, a + 10, less<int>()); //排序
  18. int n = unique(a, a + 10) - a; //去重
  19. int n1 = distance(a, unique(a, a + n)); //获得不重复元素的个数;
  20. for (int i = 0; i < n1; i++) //注意i < n
  21. cout << a[i] << " "; //0 1 5 6 7 8 9
  22. }
posted @
2020-05-24 08:21 
RioTian 
阅读(...) 
评论(...) 
编辑 
收藏

去重函数unique,sort,erase的应用的更多相关文章

  1. STL中去重函数unique

    一:unique(a.begin(),a.end());去重函数只是去掉连续的重复值,对于不连续的值没有影响,SO,在使用前一般需要进行排序处理: 二:  vector<int>::ite ...

  2. 西安电子科技大学第16届程序设计竞赛 F Operating System (unique() 去重函数)

    链接:https://www.nowcoder.com/acm/contest/107/F来源:牛客网 Operating System 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ ...

  3. unique() 去重函数

    unique()函数是一个去重函数,STL中unique的函数 unique的功能是去除相邻的重复元素(只保留一个), 还有一个容易忽视的特性是它并不真正把重复的元素删除.他是c++中的函数, 所以头 ...

  4. unique(去重函数)

    去重排序(unique函数的使用) 2013年05月30日 11:05:45 阅读数:9689更多 个人分类: 字符串处理  出处:http://www.cnblogs.com/QQbai/archi ...

  5. HDU1412-{A} + {B},通过率并不高,但同样是用一个很简洁的函数unique,超短代码水过~

    {A} + {B} Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) http: ...

  6. Linux 文本去重 之 命令sort 与 uniq

    sort [-fbMnrtuk] [file or stdin] 选项与参数: -f :忽略大小写的差异,例如 A 与 a 视为编码相同: -b :忽略最前面的空格符部分: -M :以月份的名字来排序 ...

  7. jquery 里面对数组去重操作-unique

    js: var yearArray = new Array(2009, 2009, 2010, 2010, 2009, 2010); $.unique(yearArray); alert(yearAr ...

  8. qsort函数、sort函数【转】

    http://blog.163.com/yuhua_kui/blog/static/9679964420142195442766/ 先说明一下:qsort和sort,只能对连续内存的数据进行排序,像链 ...

  9. php中的常用数组函数(八) 排序函数汇总(sort、rsort、usort、asort、uasort、arsort、ksort、uksort、krsort、natsort、natcasesort、array_multisort)

    测试环境:php5.3.29 sort_flags 可以用以下值改变排序的行为: 排序类型标记: SORT_REGULAR - 正常比较单元(不改变类型) SORT_NUMERIC - 单元被作为数字 ...

随机推荐

  1. java 设计模式-责任链

    责任链设计模式,其实就是处理同一个请求的对象连接成一条链,请求的路径经过这条链,符合要求的就处理这个请求,不符合就接着往下面抛出,直道有人处理这条请求. 业务:比如啊,公司个人请假,三天以下就是主管审 ...

  2. java运行时跟编译时的区别,欢迎大家指正

    个人博客地址:https://blog.csdn.net/qq_41907991 关于java运行时及编译时期的区别: 首先我们要了解编译以及运行的概念: 编译就是指,编译器帮你把源码翻译成机器能识别 ...

  3. Coursera课程笔记----计算导论与C语言基础----Week 11

    C程序中的字符串(Week 11) 字符数组 所有的字符串,都是以\0结尾的 只能在数组定义并初始化的时候:char c[6] = "China"; 不能用赋值语句将一个字符串常量 ...

  4. Programmatically add an application to Windows Firewall

    Programmatically add an application to Windows Firewall 回答1   Not sure if this is the best way, but ...

  5. VL01N发货过账无法冲销

    1业务场景 SD和EWM在使用BAPI:BAPI_OUTB_DELIVERY_CONFIRM_DEC发货过账后,发现外向交货单无法被冲销,后来发现是在发货过账后,有一个字段VLSTK声明仓库被维护上了 ...

  6. echarts 中 symbol 自定义图片

    首先我使用的技术框架的VUE,当然该方法在其他框架也是适用的,这点大家注意一下~ 在官方文档里面,修改标记的图形(symbol)的方法有三种: 一:ECharts 提供的标记类型有 'circle', ...

  7. Linux下安装JDK11

    Linux下安装JDK11 Linux下安装JDK可分为三步: 下载相应版本的压缩包 解压缩并移置相应目录 配置环境变量 验证结果 一.下载相应版本的压缩包 下载压缩包可以通过官网下载,如图: 下载前 ...

  8. [LA7139 Rotation(2014 shanghai onsite)]二维树状数组

    题意:有一个n*m的矩形,一辆车从左上角出发,沿一条路径走,路径是由矩形上每个单元格的边构成的,最后回到左上角,求车子在每个格子转过圈数的平方和. 思路:假设需要记录每个格子转的顺时针的圈数(为负表示 ...

  9. mysql查询日期分组,不存在的补全0,做每天数据图表,根据日期,N天数往前查

    SELECT IFNULL( DATA.count, 0 ) AS count, day_list.DAY AS createTime FROM ( SELECT DATE_FORMAT( creat ...

  10. android 防止多次点击,导致事件监听响应到其他界面

    下面有个案例: A点击的时候就跳转到B界面,点击B界面后结束,返回到A界面中 1.此时在B界面中,设置点击事件,点击后结束B v.setOnClickListener(new OnClickListe ...