c++ unique()函数,用来给vector去重

直接使用

一行代码完成去重
注意vector必须排序后,不然可能结果不正确

vector<int> vt{1,2,3,3,5,4,7,5};
sort(vt.begin(),vt.end());
vt.erase(unique(vt.begin(),vt.end()),vt.end());
//vt :1 2 3 4 5 7

详细介绍

然后来看unique函数,unique参数接受两个迭代器,分别用来指定要去重的范围,是这样的区间,[begin,end)。所以传递vt的begin和end迭代器刚好。
unique执行之后并不是直接把重复的元素删掉,而是在容器内移动元素,并且容器的大小也不会改变,请看这个例子
在这里插入图片描述
forv是一个用来输出容器值的宏,定义如下。
在这里插入图片描述
通过输出值可以看到,重复的3,5不见了,7,8反而多出来了。这是因为容器内元素往前移动了

unique的返回值是一个迭代器,它指向最后一个不重复元素之后的位置,也就是 1 2 3 4 5 7 8 7 8中的第一个8之后的7
我们取得这个迭代器之后,调用erase算法,可以移除掉尾部重复的元素
在这里插入图片描述
it就是返回的迭代器
写成一行的形式就是之前提到的 vt.erase(unique(vt.begin(),vt.end()),vt.end());

注意事项

unique只对有序的值有效,无序的话可能会出错,读者可以自己测试一下。

补充

读者可能会感到疑惑,按道理来说一个容器调用unique之后,就应该是去重了,为什么要写得这么麻烦?

这是因为,像unique,sort这些标准库算法,它们接受的是迭代器,操作对象也是迭代器,并不是容器本身。所以这些算法执行时是无法添加或删除容器元素的 (出处在Cpp Primer第10.2.3节)
所以我们要取得unique返回的迭代器之后继续erase

那为什么erase可以删除元素?
因为我们调用的erase,是vector的成员函数,并非之前提到的标准库函数。

  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值