unique函数用法
unique包含在头文件
#include <algorithm>
函数作用:“去除”容器或数组中相邻元素之间重复出现的元素
unique函数的三个参数:
1、想要去重的数据集的起始地址
2、想要去重的最后一个元素的下一个元素的地址
3、比较函数(可以省略,也可以自定义,一般不太用到第三个参数)
返回值:返回的是去重后的不重复数列中最后一个元素的下一个元素的地址(注意是类似于0x的真正地址)
注意:
1、该函数并非真正地去除重复元素,只将不重复的元素排在数组最前边,但是去重后的数组最后的元素不变。(注意有一些说法是“去重之后是把重复的元素藏在了最后”, 这种说法是不准确的)
2、针对的是相邻元素,也就是说对于顺序错乱的数组,需要先进行排序,再配合erase后,才可以实现真正意义上的去重(也可以根据返回值枚举不重复的部分)
erase函数是针对容器的函数,不在algorithm库中,因此数组无法使用该函数。
时间复杂度:O(n)
代码案例
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int a[]={2,3,4,4,6};
//sort(a,a+5); //一般在使用unique之前都需要进行排序,由于这里是已经排好序的,所以不再使用
unique(a,a+5); //使用unique函数对数组进行去重
for(int i=0;i<5;i++)
{
cout<<"a["<<i<<"]="<<a[i]<<endl;
}
cout<<unique(a,a+5)<<endl; //返回不重复数列中最后一个元素下一个元素的地址
cout<<a+4<<endl; //输出a[4]的地址,发现与unique函数的返回值相同
cout<<"不重复数列的长度:"<<unique(a,a+5)-a<<endl; //不重复序列的长度为4
}
运行结果
通过运行结果可以看出,unique并不是真正地将重复元素进行了删除,而是不断将不重复的元素移动到数组的前面,最后返回的是返回的是去重后的不重复数列中最后一个元素的下一个元素的地址,如果需要计算该地址所对应的下标,则利用unique(a,a+n)-a即可。
(关于unique配合erase函数来实现真正去重的内容,以后再进行补充,现在还没学到)