一、去重的原理
C++标准库中的unique算法可以去除相邻的重复元素,这种去重的原理是依次检查相邻两个元素是否相等,如果相等就删除后面的元素,直到检测完所有元素为止。unique算法并没有改变容器中的大小,同时返回去重后的尾指针,可以通过该指针得知去重后容器中元素的个数。
二、不同容器的用法
1. vector
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
vector
v = {1, 2, 2, 3, 3, 3, 4, 4, 4, 4};
auto it = unique(v.begin(), v.end());
v.erase(it, v.end());
for(auto i : v)
cout << i << " ";
return 0;
}
上述代码构造了一个vector,然后调用unique算法,实现了去重操作,最后输出去重后的vector元素。
2. list
#include <iostream>
#include <list>
#include <algorithm>
using namespace std;
int main()
{
list
l = {1, 2, 2, 3, 3, 3, 4, 4, 4, 4};
l.unique();
for(auto i : l)
cout << i << " ";
return 0;
}
list的去重操作可以在list容器对象上直接调用unique函数实现,这是因为list容器内部实现了去重操作。
3. set
#include <iostream>
#include <set>
using namespace std;
int main()
{
set
s = {1, 2, 2, 3, 3, 3, 4, 4, 4, 4};
for(auto i : s)
cout << i << " ";
return 0;
}
set容器本身就具有去重的功能,重复元素将无法插入到set容器中,因此只需将元素插入set容器中即可实现去重操作。
三、关键字去重
以上的去重算法都是比较元素是否相等来进行去重的,然而在关键字去重的场景下,会根据元素的某些属性进行去重。此时需要自定义去重判断的方法。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
struct Person
{
string name;
int age;
bool operator==(const Person &p) const
{
return name == p.name && age == p.age;
}
};
int main()
{
vector<Person> v = {{"张三", 20}, {"李四", 22}, {"张三", 20}, {"王五", 25}, {"李四", 22}};
auto it = unique(v.begin(), v.end(), [](const Person &p1, const Person &p2) {return p1 == p2;});
v.erase(it, v.end());
for(auto i : v)
cout << i.name << " " << i.age << endl;
return 0;
}
上述代码中自定义了Person结构体,然后在unique算法中使用了lambda表达式,重载了判断规则,实现了按照Person结构体中的name和age属性进行去重操作。
四、使用场景
unique算法在实际开发中的使用场景较多,例如:
1.去除重复的网络请求数据;
2.对算法重复输出的结果进行去重;
3.多通道信号过滤;
4.等等。
总结
本文详细介绍了C++标准库中的unique算法,包括去重原理、在不同容器中的使用以及关键字去重方法,同时给出了使用场景。unique算法的使用可以大大简化代码,提高开发效率。