unique用于消除相邻重复元素,可用于数组,动态数组,不可用于string字符串,可用于char字符串
char类型字符串
char a[]={'a','a','b','c'};
auto b=unique(a,a+4)-a;//unique(字符串名字+消除重复位置的开头,字符串名字+消除重复位置结尾)
for (auto i=0;i!=b;i++)cout<<a[i]<<" ";
//输出a b c
数组
int a[]={1,1,2,3,4,4};
//unique参数同上(都是开头取结尾不取左闭右开)
auto b=unique(a,a+6);
for (auto i=a;i!=b;i++)cout<<*i<<" "; //输出1,2,3,4
//如果b不减a(数组名),返回的是指向排完序数据的后一位指针
auto b=unique(a,a+6)-a;
for (auto i=0;i!=b;i++)cout<<a[i]<<" "; //输出1,2,3,4
//减去a后,指针减指针,返回排序完数据的后一位下标
动态数组
vector<int> a={1,2,2,3,4,4,5};
auto b=unique(a.begin(),a.end());
//动态数组参数不同,但也是左闭右开unique(开始位置迭代器,结束位置迭代器)
//动态数组返回值也不同,返回的是处理过后的数据的后一位的位置的迭代器
for (auto i=a.begin();i!=b;i++)cout<<*i<<" "; //输出1,2,3,4,5
unique()函数不会删除重复元素,只会覆盖原先数据,未覆盖的数据将保持原样。
int a[]={1,1,2,3,4,4};
unique(a,a+6);
for (auto i:a)cout<<i<<" "; //输出1,2,3,4,4,4
由于最后两位未被覆盖,所以保留了
int a[]={1,1,1,1,2,3,4,5,6};
unique(a,a+6);
for (auto i:a)cout<<i<<" "; //输出1,2,3,4,5,6,4,5,6
想要消除后面未覆盖的元素可以使用erase()函数
erase()的参数使用方法和unique一样,但是只能用于动态数组(因为改变了数组大小)。
vector<int> a = {1, 1, 1, 1, 2, 3, 4, 5, 6};
auto newEnd = unique(a.begin(), a.end());
for (auto i : a)
cout << i << " ";//输出1,2,3,4,5,6,4,5,6
cout<<a.size();//输出9
a.erase(newEnd, a.end());
for (auto i : a)
cout << i << " ";//输出1,2,3,4,5,6
cout<<a.size();//输出6
return 0;
注意不要不删除重复元素就二次调用uniqu(),第二次调用时可能会返回一个与第一个不同的值,因为原数组改变了(根据覆盖的规则)
vector<int> a = {1, 1, 1, 1, 2, 3, 4, 5, 6};
unique(a.begin(), a.end());
for (auto i : a)
cout << i << " ";//输出1,2,3,4,5,6,4,5,6
cout<<a.size();//输出9
auto newEnd = unique(a.begin(), a.end());
a.erase(newEnd, a.end());
for (auto i : a)
cout << i << " ";//输出1,2,3,4,5,6,4,5,6
cout<<a.size();//输出9
return 0;