unique函数--去重操作浅析

首先我们得知道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相差无几。
其实,建议各位可以自己动手实践一下这样效果更好。

猜你喜欢

转载自blog.csdn.net/malloch/article/details/106134021
今日推荐