1. 程式人生 > >unique() [c++去重函式]

unique() [c++去重函式]

原文地址
https://blog.csdn.net/tomorrowtodie/article/details/51907471
CF上的程式碼是開放的,常常就能看到本渣與大神們的差距

比如去重。。。

這是本鶸程式碼。。。。。。。

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N = 100000;
int a[N+5];
int b[N+5];
int main()
{
    int n;
    while (cin>>n)
    {
        for (int i = 0;i < n;++i)
        {
            scanf("%d",&a[i]);
        }
        sort(a,a+n);
        b[0] = a[0];int k = 0;
        for (int i = 1;i < n;++i)//去重
        {
            if (a[i]!=a[i-1])
            {
                b[++k] = a[i];
            }
        }
        for (int i = 0;i <= k;++i)
        {
            printf("%d ",b[i]);
        }
        puts("");
    }
    return 0;
}

然而大神是這樣寫的:

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N = 100000;
int a[N+5];
int main()
{
    int n;
    while (cin>>n)
    {
        for (int i = 0;i < n;++i)
        {
            scanf("%d",&a[i]);
        }
        sort(a,a+n);
        n = unique(a,a+n) - a;//關鍵的一句
        for (int i = 0;i < n;++i)
        {
            printf("%d ",a[i]);
        }
        puts("");
    }
    return 0;
}

unique()是C++標準庫函式裡面的函式,其功能是去除相鄰的重複元素(只保留一個),所以使用前需要對陣列進行排序
上面的一個使用中已經給出該函式的一個使用方法,對於長度為n陣列a,unique(a,a+n) - a返回的是去重後的陣列長度

那它是怎麼實現去重的呢?刪除?

不是,它並沒有將重複的元素刪除,而是把重複的元素放到陣列的最後面藏起來了

當把原長度的陣列整個輸出來就會發現:

while (cin>>n)
    {
        for (int i = 0;i < n;++i)
        {
            scanf("%d",&a[i]);
        }
        sort(a,a+n);
        int k = unique(a,a+n) - a;
        for (int i = 0;i < n;++i)
        {
            printf("%d ",a[i]);
        }
        puts("");
    }

上述程式碼就是去重後再把原陣列輸出,測試一下看看結果就懂了

其中 1 2 8 9 10就是去重後的陣列,我這裡把後面“藏起來”的數也輸出了,方便理解

另外,這個函式還可以這樣用:

#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std;
const int N = 1000;
int a[N + 5];
int main()
{
    int n;
    while (cin >> n)
    {
        for (int i = 0;i < n;++i) scanf("%d",&a[i]);
        sort (a, a + n);
        vector<int>v (a, a + n);
        vector<int>::iterator it = unique (v.begin(), v.end() );
        v.erase (it, v.end() );//這裡就是把後面藏起來的重複元素刪除了
        for ( it = v.begin() ; it != v.end() ; it++ )
        {
            printf ("%d ", *it);
        }
        puts("");
    }
    return 0;
}

這個就是利用vector把後面藏著的元素刪除了


作者:Must_so
來源:CSDN
原文:https://blog.csdn.net/tomorrowtodie/article/details/51907471
版權宣告:本文為博主原創文章,轉載請附上博文連結!

博主小注
在這裡插入圖片描述