unique() [c++去重函式]
阿新 • • 發佈:2018-12-26
原文地址
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
版權宣告:本文為博主原創文章,轉載請附上博文連結!
博主小注