1.unique ) )是c标准库函数中的函数,其功能是去除相邻的重复元素(必须注意是相邻元素且只保留一个),因此在使用前必须对数组进行排序),那么删除?

不,不是删除重复的元素,而是将重复的元素隐藏在数组的最后

当把原长度的数组整个输出来就会发现

其实是:

其中的1 2 8 9 10是去除了重量的排列,之后的8 9 9 9 10被“隐藏”了。

验证示例:

wile(cinn ) ) for ) intI=0; i n; I ) Scanf(‘%d ‘,a[i]; }sort(a,a n ); intk=unique(a,a n )- a; //另一种用法:对于长度为n的序列a,unique(a,a n )- a返回去除后的序列长度kfor(intI=0); I ) {printf(‘%d ‘,a[i] ); } puts (‘ ); }结果:

2 .原理:原理是将前不重复的要素向后重叠,返回最后不重复的要素的下一个要素的坐标(迭代程序)。 **end(** )是指最后一个元素的下一个迭代器

原理代码

迭代器my _ unique (迭代器first,迭代器last ) /两个参数都是迭代器(if(first==last ) return last; //只有一个要素时iterator result=first; //从第一个要素开始while(first!=last最后的要素{if(*result!=*first(/发现不重复的元素(* ) *( result )=*first; //覆盖上一个元素(}return result; //返回下一个不重复元素的坐标的迭代器(3.示例: # include cstdio # include algorithm # includevectorusingnamespacestd; 常数int n=1000; int a[N 5]; int main () { int n; wile(CIN ) ) for ) intI=0; i n; I ) scanf(‘%d ‘,a[i]; sort(a,a n ); 向量Intv (a,a n ); vector int :3360 iterator it=unique (v.begin ),v.end ); //迭代器V.Erase(IT,v.end ),获取下一个不重复元素的坐标; //这里删除了后面“隐藏的”重复元素。 利用vector将隐藏在后面的要素转换为for(it=v.begin ); it!=v.end (; it ) {printf(‘%d ‘,*it ); } puts (‘ ); }返回0; }结果:

4.unique ) )另一种用法: k=unique(a,a n )- a; 意思是,对于长度为l的数组a,unique(a,a n )- a返回加权后的数组长度k

示例

# include iostream # include cstdio # includealgorithmusingnamespacestd; 常数int n=100000; int a[N 5]; int main () { int n; wile(cinn ) ) for ) intI=0; i n; I ) Scanf(‘%d ‘,a[i]; }sort(a,a n ); n=unique(a,a n )- a; //关键的for(intI=0; i n; I ) {printf(‘%d ‘,a[i] ); } puts (‘ ); }返回0; 结果: