C++ STL 中unique详解
一. 概念
unique的作用是去重。即“删除”序列中重复的相邻元素, 此处的删除不是真正的删除, 而是让不重复元素替换掉重复元素所在的位置。由于它是”删除”相邻的元素, 所以在使用unique
之前, 一般要给序列排序。
二. 函数原型
- 只有两个参数且都是迭代器。
1 | iterator unique(iterator it_1,iterator it_2); |
这种类型的unique函数是我们最常用的形式。其中这两个参数表示对容器中[it_1,it_2)范围的元素进行去重(注:区间是前闭后开,即不包含it_2所指的元素),返回值是一个迭代器,它指向的是去重后容器中不重复序列的最后一个元素的下一个元素。
- 有三个参数, 除了两个迭代器之外还有个自定义函数。
1 | iterator unique(iterator it_1,iterator it_2,bool MyFunc); |
第三个参数是自定义元素相等。关于第三个参数的介绍, 可参考http://www.cplusplus.com/reference/algorithm/unique/
三. 用法实例
上面介绍了unique函数的功能和原型,那么,它到底是如何进行去重的呢?即“删除”的具体操作是怎样的呢?
关于这个问题,http://www.cplusplus.com/reference/algorithm/unique/给了我们一种解释,即unique函数是完全等价于下面这个函数的:
1 | iterator My_Unique (iterator first, iterator last) |
分析这段代码,我们可以知道,unique函数的去重过程实际上就是不停的把后面不重复的元素移到前面来,也可以说是用不重复的元素占领重复元素的位置。
四. 注
有很多文章说的是,unique去重的过程是将重复的元素移到容器的后面去,实际上这种说法并不正确,应该是把不重复的元素移到前面来。
一定不要忘记的是,unique函数在使用前需要对容器中的元素进行排序(当然不是必须的,但我们绝大数情况下需要这么做)。
unique函数通常和erase函数一起使用,来达到删除重复元素的目的。
恰似你一低头的温柔,较弱水莲花不胜寒风的娇羞, 我的心为你悸动不休。 --mingfuyan
千万不要图快——如果没有足够的时间用来实践, 那么学得快, 忘得也快。
原文作者: Mingfu Yan
原文链接: https://solodance.top/2020/06/26/C++ STL 中unique详解/
版权声明: 转载请注明出处(必须保留作者署名及链接)