unique()函数

文章介绍了C++标准库中的unique函数在处理数组(固定和动态)中去除重复元素的方法,以及erase函数的使用。强调了unique不会删除元素而是覆盖,以及在操作后可能影响后续unique调用的结果。
摘要由CSDN通过智能技术生成

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;

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值