首先我们得知道unique函数的头文件是#include
unique函数的作用:将一个数组中的不相同的元素提前,并且返回最后一个不相同的元素的后一位的地址。
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
int a[10] = {
0, 7, 7, 6, 1, 1, 5, 5, 8, 9 };
int n = unique(a, a + 10) - a;
cout << n << endl; //7 得到不重复元素的个数;
for (int i = 0; i < 10; i++)
cout << a[i] << " "; //0 7 6 1 5 8 9 5 8 9(完成去重后的数组)
cout<<endl;
for(int i=0;i<n;i++)
cout<<a[i]<<" ";//0 7 6 1 5 8 9//让i<n就是只输出前面不重复的数字,这样就实现的去重的效果。
return 0;
}
在上述代码中int n=unique(a,a+10)-a;n即是表示有多少个不相等的元素。
其次在unique函数中,只会识别相邻的是否是相等的元素,因此我们一般使用sort与unique函数的联合使用:
#include<iostream>
#include<algorithm>//sort()与unique()的联合运用
#include<functional>//less<int>()
using namespace std;
int main()
{
int i;
int a[10] = {
0, 7, 7, 6, 1, 1, 5, 5, 8, 9 };
sort( a, a + 10, less<int>() );//排序
for(i=0;i<10;i++)
cout<<a[i]<<" ";
cout<<endl;
int n = unique(a, a + 10) - a; //去重
for (i=0;i<n;i++)//注意i < n
cout << a[i] << " ";//0 1 5 6 7 8 9(直接输出不同的元素)
cout<<endl;
for(i=0;i<10;i++)
cout<<a[i]<<" ";//0 1 5 6 7 8 9 7 8 9(在将不同的元素提前后,后面补位)
}
通过sort先将数组进行排序,以此来使得相同的数字都是在一起的,再进行unique函数的操作。
除了上面的普通数组的以外,vector容器如下使用:
#include<iostream>
#include<algorithm>//sort(), unique()
#include<functional>//less<int>()
#include<string>
#include<vector>
using namespace std;
int main()
{
int i,b;
vector<int> a(10);
for(i=1;i<=10;i++)
{
cin>>b;
a[i]=b;
}
sort(a.begin(),a.end());
vector<int>::iterator it=a.begin();
unique(a.begin(),a.end());
for(i=1;i<=10;i++)
cout<<a[i]<<endl;
return 0;
对于unique函数,我们需要通过a.begin和a.end来作为头和尾来进行运算。同时也可以定义迭代器来进行。
而在string函数中,使用unique函数时,eg:定义string str=“asdsf”,若是要进行unique函数,则
unique(str.begin(),str.end());
表示对str进行去重操作。
在返回个数方面:
1.不同的数组:int n = unique(a, a + 10) - a;
2.vector: vector::iterator itd=unique(a.begin(),a.end());
这个时候要注意了,返回的itd是一个地址指向的是下一个元素的位置,eg:有12345432为已经unique后的vector数组,我们可以知道12345为不同元素,这itd指向的为5后面的4的位置,而此时*itd为4,不是指的个数。(这个点当时我脑子没有转过来,困扰了我很久)
3.string:string::iterator itend = unique(str.begin(), str.end()); //返回出现重复元素的首地址,这个string和上面的vector相差无几。
其实,建议各位可以自己动手实践一下这样效果更好。