他不香吗?-STL之去重函数unique()

很多同学都会遇到去重这样的问题
在没有认识到STL之前都是利用数组下标来解决
例如:

#include<bits/stdc++.h>
using namespace std;
int num[10000];//以10000以内的数据举例子 
int cn[10000];
int main(){
   
 int n;
 cin>>n;
 int a,b,c;
 for(int i=0;i<n;i++){
   
  cin>>num[i];
  cn[num[i]]++;//将数据以数据下标储存 
 }
 for(int i=1;i<=10000;i++){
   
  if(cn[i]) cout<<i<<" ";//在数据比较小的时候还是很好使用的 
 }
 return 0;
}

这种利用数组下标的去重方法是比较不错的,但是随着数据的多样化和数据的复杂化,是很容易超时的。下面我们将引入STL中的重函数unique()函数。
我们用去重函数unique()写出与上一代码相同作用的代码
如下:

#include<bits/stdc++.h>
using namespace std;
int num[10000];
int main(){
   
 int n;
 cin>>n;
 int a,b,c;
 for(int i=0;i<n;i++){
   
  cin>>num[i];
 }
 sort(num,num+n);
 int x;
 x=unique(num,num+n)-num;//关键的一步 
 for(int i=0;i<x;i++){
   
  cout<<num[i]<<" ";
 } 
 return 0;
}

注意:unique去除的是相邻的重复元素,所以在进行数组排序之前一般用都会要排一下序
从代码长度来看似乎差不多但是注意在无论数据类型和复杂程度上都是很具有优势的。

下面来看一下unique函数对于字符串的去重
例如:

#include<bits/stdc++.h>
using namespace std;
int main() {
   
 string str;
 cin>>str;
 str.erase(unique(str.begin(),str.end()),str.end());//借助一下string中的erase 
 cout<<str<<endl;
 return 0;
}
  • unique是c++中的函数,所以头文件要加#include<iostream.h>,具体用法如下:
 int num[100];
 unique(num,mun+n)

返回的是num去重后的尾地址,所以在进行数组去重时使用方法如下:

sort(num,num+n);
 int x;
 x=unique(num,num+n)-num;
  • 可能有读者知道STL中的set,set的插入是可能无法成功的,在数据比较多的时候频繁插入的时候是会出问题的(只是笔者的自己经历)。