C++ STL中forward_list::unique()函数
介绍
C++ STL中,forward_list
是单向链表,每个节点仅指向下一个节点。其中的unique()
函数用于删除链表中重复的元素。当链表中有多项重复元素时,只保留第一项,并将其他项删除。
函数原型
unique()
函数的原型如下:
void unique();
函数将当前链表中相邻的元素进行比较,找出重复的项并删除。注意,函数仅能删除相邻的重复项,如果链表中有跨节点的重复项,则不能被删除。
使用示例
考虑以下代码:
#include <iostream>
#include <forward_list>
int main() {
std::forward_list<int> f_list = {1, 2, 2, 3, 3, 3, 4, 5, 5};
std::cout << "Before unique: ";
for(int i: f_list) {
std::cout << i << " ";
}
std::cout << std::endl;
f_list.unique();
std::cout << "After unique: ";
for(int i: f_list) {
std::cout << i << " ";
}
std::cout << std::endl;
return 0;
}
代码中创建了一个forward_list
并初始化了一些元素。在调用unique()
函数后,会删除其中重复的项。控制台输出如下所示:
Before unique: 1 2 2 3 3 3 4 5 5
After unique: 1 2 3 4 5
可以看到,重复的元素被删除了,只保留了第一次出现的元素。
自定义比较器
可以使用unique()
函数默认的比较方式来查找重复项,也可以自定义比较器来实现一些特殊的需求。比如,如果需要将两个元素的差的绝对值小于某个值的视为相等,可以这样定义一个比较器:
bool is_close(int a, int b) {
return std::abs(a - b) < 3;
}
int main() {
std::forward_list<int> f_list = {1, 2, 4, 5, 8, 9, 11, 13};
std::cout << "Before unique: ";
for(int i: f_list) {
std::cout << i << " ";
}
std::cout << std::endl;
f_list.unique(is_close);
std::cout << "After unique: ";
for(int i: f_list) {
std::cout << i << " ";
}
std::cout << std::endl;
return 0;
}
输出结果为:
Before unique: 1 2 4 5 8 9 11 13
After unique: 1 4 8 11 13
可以看到,函数使用了自定义的比较器,将差的绝对值小于3的数字视为相等,删除了剩余的元素。
结论
forward_list
中的unique()
函数可以帮助我们删除链表中的重复项,它默认比较相邻元素,仅删除相邻的重复项。也可以通过自定义比较器来实现特殊的需求。