原因
最近要进行程设的期末考试了,复习STL的时候看到了sort和unique.
以前用的时候总觉得有些模糊,正好趁复习再巩固一下.
测试
#include <bits/stdc++.h>
using namespace std;
void print(int* a,int n)
{
for(int i=0;i<n;i++)
cout<<a[i]<<" ";
cout<<endl;
}
int main()
{
//想要测试关于unique以及sort相关的函数
//假定数据为1 1 2 6 5 1 1 4 7 5
int a[]={1,1,2,6,5,1,1,4,7,5};
int n=sizeof(a)/sizeof(int);
print(a,n); //1 1 2 6 5 1 1 4 7 5
int* end=unique(a,a+n); //普通的unique只会去除相邻的重复项
print(a,end-a); //1 2 6 5 1 4 7 5
sort(a,a+n); //先对数据进行排序 时间复杂度O(nlogn)
print(a,n); //1 1 1 1 2 4 5 5 6 7
int* b=unique(a,a+n); //对排序后的数据进行去重
print(a,b-a); //1 2 4 5 6 7
}
结果分析
如果想要对一组数据进行去重操作
- 如果顺序重要,可以直接使用unique函数,返回一个迭代器或者说指针指向末尾位置.
但是只能做到去除相邻的重复项. - 如果顺序不重要,可以先对数据进行sort排序,然后将排序后的数据进行一个unique去重.
通过返回的迭代器.
对应使用
上述题目来源于SDUOJ-CSP模测第三场
题解核心代码
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5;
int n,m;//count of Num and operation
int Nums[maxn];
void init()
{
cin>>n>>m;
for(int i=0;i<n;i++)
cin>>Nums[i];
int* b=unique(Nums,Nums+n);
n=b-Nums;
}
void Operation()
{
int temp,a,b;
cin>>temp;
if(temp==1)//operation 1
{
cin>>a>>b;//a->b
for(int i=0;i<n;i++)
{
if(Nums[i]==a)
Nums[i]=b;
}
int* end=unique(Nums,Nums+n);
n=end-Nums;
}
if(temp==2)
{
cout<<n<<endl;
}
}
int main()
{
init();
for(int i=0;i<m;i++)
Operation();
return 0;
}