一. 概念

unique的作用是去重。即“删除”序列中重复的相邻元素, 此处的删除不是真正的删除, 而是让不重复元素替换掉重复元素所在的位置。由于它是”删除”相邻的元素, 所以在使用unique之前, 一般要给序列排序。

二. 函数原型

  1. 只有两个参数且都是迭代器。
1
iterator unique(iterator it_1,iterator it_2);

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

  1. 有三个参数, 除了两个迭代器之外还有个自定义函数。
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
2
3
4
5
6
7
8
9
10
11
12
iterator My_Unique (iterator first, iterator last)
{
if (first==last) return last;

iterator result = first;
while (++first != last)
{
if (!(*result == *first))
*(++result)=*first;
}
return ++result;
}

分析这段代码,我们可以知道,unique函数的去重过程实际上就是不停的把后面不重复的元素移到前面来,也可以说是用不重复的元素占领重复元素的位置。

四. 注

  1. 有很多文章说的是,unique去重的过程是将重复的元素移到容器的后面去,实际上这种说法并不正确,应该是把不重复的元素移到前面来。

  2. 一定不要忘记的是,unique函数在使用前需要对容器中的元素进行排序(当然不是必须的,但我们绝大数情况下需要这么做)。

  3. unique函数通常和erase函数一起使用,来达到删除重复元素的目的。

恰似你一低头的温柔,较弱水莲花不胜寒风的娇羞, 我的心为你悸动不休。  --mingfuyan

千万不要图快——如果没有足够的时间用来实践, 那么学得快, 忘得也快。