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. Vue移动端项目中下拉刷新和上拉加载

    Vue2.0中引入Mint-UI的下拉刷新和上拉加载.简单粗暴 安装Mint-UI npm i mint-ui -S 引入 打开项目的main.js入口文件,引入并使用.注意,为了方便,这里是全部引入 ...

  2. Eclipse插件svn和TortoiseSvn版本对应关系

    2019独角兽企业重金招聘Python工程师标准>>> 先说一下今天碰到问题,自己在建svn仓库和导入,导出时因为版本不一致导致的错误. 因此一定要保证Eclipse中svn插件版本 ...

  3. 常用的CSS小技巧

    实际开发过程中会遇到一些需要用CSS小技巧处理的布局问题,现在分享几个个人工作中遇到的小问题和解决方案. 1.inline元素间的空白间隙 这里要介绍一个神器font-size:0. 如果你写了个列表 ...

  4. 从零开始配置webpack(基于webpack 4 和 babel 7版本)

    webpack 核心概念: Entry: 入口 Module:模块,webpack中一切皆是模块 Chunk:代码库,一个chunk由十多个模块组合而成,用于代码合并与分割 Loader:模块转换器, ...

  5. 疯子的算法总结10--最小生成树Kruscal

    按照权值排序可得,就有如下顺序: 1. 1-2 1 2. 1-4 2 3. 1-5 2 4. 2-5 3 5. 2-3 4 6. 4-5 4 每次选取最小边泉,判断是否同属一个集合,如果不属于同一集合 ...

  6. 15分钟从零开始搭建支持10w+用户的生产环境(四)

    上一篇文章,介绍了这个架构中,WebServer的选择,以及整个架构中扩展时的思路. 原文地址:15分钟从零开始搭建支持10w+用户的生产环境(三)   五.架构实践 前边用了三篇文章,详细介绍了这个 ...

  7. Linova and Kingdom(树型-贪心)

    题目大意:给定一棵树,1为首都(首都可以是工业城市也可以是旅游城市),一共有n个点. 其中要选出k个工业城市,每个工业城市出一个代表去首都,其快乐值是其途径旅游城市(非工业)的个数 求所有快乐值相加的 ...

  8. 树的最小支配集 E - Cell Phone Network POJ - 3659 E. Tree with Small Distances

    E - Cell Phone Network POJ - 3659 题目大意: 给你一棵树,放置灯塔,每一个节点可以覆盖的范围是这个节点的所有子节点和他的父亲节点,问要使得所有的节点被覆盖的最少灯塔数 ...

  9. dbcp数据源连接池

    一.数据源连接池 我们之前利用jdbc连接数据库,每次都要创建连接对象,销毁连接对象,如果并发访问量比较大,这样肯定比较辣 浪费数据库的效率,我们可以像之前mybatis中缓存查询到的数据一样,可以把 ...

  10. Spring Cloud学习 之 Spring Cloud Ribbon(执行流程源码分析)

    Spring Boot版本:2.1.4.RELEASE Spring Cloud版本:Greenwich.SR1 文章目录 分析: 总结: 分析: ​ 在上篇文章中,我们着重分析了RestTempla ...