直接使用
一行代码完成去重
注意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的成员函数,并非之前提到的标准库函数。