前言
unique是 c++标准模板库STL中十分实用的函数之一,使用此函数需要#include《algorithm》
该函数的作用是“去除”容器或者数组中相邻元素的重复出现的元素
这里的去除并非真正意义的erase,而是将不重复的元素放到容器的前端,重复的元素位于容器的末尾。
unique用法
1、unique函数是常见的数据去重函数,使用前需要将数据进行排序,如果传入的参数为数组,其返回不重复的最后一个元素的下一位地址。
int num[10] = { 1,2,3,5,4,3,7,4,5,6 };
sort(num, num + 10);
int ans = unique(num, num + 10) - num;//返回不重复元素的个数,unique参数传入数组时返回最后一个不重复元素的下一位地址
cout << ans<<endl;
2、传入的参数为迭代器,其同样返回一个迭代器,位置也是最后不重复元素的下一位,通常配合erase函数,将返回的迭代器至,end()擦除,从而实现数据的真正去重。
int num1[10] = { 1,2,3,5,4,3,7,4,5,6 };
vector<int>a;
for (int i = 0; i < 10; i++)
{
a.push_back(num1[i]);
}
sort(a.begin(),a.end());
for (auto item : a)
{
cout << item<<" ";
}
cout << endl;
a.erase(unique(a.begin(), a.end()), a.end());
for (auto item : a)
{
cout << item << " ";
}
下面为我自己实现的unique函数,返回的是vector类型的迭代器。通过遍历整个vector数组,如果元素为第一个或者是与前面元素不同,就将该元素放至数组前端。
vector<int>::iterator unique(vector<int>&a)
{
int j = 0;//存储去重后的数据
for (int i = 0; i < a.size(); i++)
{
if(i==0||a[i]!=a[i-1])
{
a[j] = a[i];
j++;
}
}
return a.begin() + j;//a[0]~a[j-1]是去重后的数据
}
数组实现
int* unique1(int a[],int len)
{
int j = 0;
for (int i = 0; i < len; i++)
{
if (i == 0 || a[i] != a[i - 1])
{
a[j] = a[i];
j++;
}
}
return a + j;
}
测试结果