unique()函数作用是“去掉”容器中相邻元素的重复元素,然后返回指向第一个重复元素的迭代器。unique()实质上是一个伪去除,它并不是真正把重复的元素删除,而是用不重复的元素把重复的元素覆盖了,所以总长度其实是不变的。
因此在利用unique()函数前需要对容器内的数据排序,可以通过sort()函数实现。sort()函数的作用是对容器指定范围内的元素按指定格式进行排序,默认从小到大。
在利用unique()函数后需要擦除从返回的迭代器对于的元素到最后元素的所有的元素,可以通过erase()函数实现。erase()函数的作用是擦除容器指定范围内的元素。
另外需要说明的是:
- sort()函数的头文件为:#include <algorithm>
- unique()函数的头文件为:#include <iostream>
- erase()函数为容器对象自身的操作,包含头文件:#include <vector> 即可
- 一般情况下,三个函数均只需要传入两个参数(两个迭代器/地址,且左闭右开)。
综上:主要思路为,先排序,再唯一,最后删除最后面的那段“重复”元素。
举例:
先构造这样一个vector
int construct[10] = {1, 3, 6, 4, 7, 2, 3, 4, 8, 9};
vector<int> goal(construct, construct+10); // 1, 3, 6, 4, 7, 2, 3, 4, 8, 9
①首先将vector排序
sort(goal.begin(), goal.end()); // 1, 2, 3, 3, 4, 4, 6, 7, 8, 9
②然后使用unique算法,unique返回值是重复元素的开始位置
auto pos = unique(goal.begin(), goal.end()); // 1, 2, 3, 4, 6, 7, 8, 9, 3, 4
// ^
③最后删除后面的那段重复部分
goal.erase(pos, goal.end()); // 1, 2, 3, 4, 6, 7, 8, 9
完整代码:
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main()
{
int construct[10] = {1, 3, 6, 4, 7, 2, 3, 4, 8, 9};
vector<int> goal(construct, construct+10); // 1, 3, 6, 4, 7, 2, 3, 4, 8, 9
sort(goal.begin(), goal.end()); // 1, 2, 3, 3, 4, 4, 6, 7, 8, 9
auto pos = unique(goal.begin(), goal.end()); // 1, 2, 3, 4, 6, 7, 8, 9, 3, 4
goal.erase(pos, goal.end()); // 1, 2, 3, 4, 6, 7, 8, 9
for(int it : goal)
cout << it << ' ';
return 0;
}
另外对于一些容器中数据类型,如结构体、类等,为了实现去重操作,还可以通过对sort算法需要重载“<”操作符、对unique算法需要重载“==”操作符,通过对其中的某一成员变量进行操作来实现。
对vector的去重操作还可以利用set容器的特性实现,思路比较简单,在此不再说明,直接用代码举例如下:
#include <iostream>
#include <algorithm>
#include <vector>
#include <set>
using namespace std;
int main()
{
int construct[10] = {1, 3, 6, 4, 7, 2, 3, 4, 8, 9};
vector<int> goal(construct, construct+10); // 1, 3, 6, 4, 7, 2, 3, 4, 8, 9
set<int> temp(goal.begin(), goal.end()); // 1, 2, 3, 4, 6, 7, 8, 9
goal.assign(temp.begin(), temp.end()); // 1, 2, 3, 4, 6, 7, 8, 9
for(int it : goal)
cout << it << ' ';
return 0;
}
注意:通过上述两种方法得到的结果均为排序后的结果。