C++ STL中的forward_list::remove()和forward_list::remove_if()
STL中的正向链表实现了 单向链表 。正向链表是在C++11中引入的,比其他容器在插入、删除和移动操作(如排序)上更加有用,并允许元素的时间常量插入和删除。它与列表的不同之处在于,正向链表仅跟踪下一个元素的位置,而列表则跟踪下一个和上一个元素的位置。
forward_list::remove()
remove() 函数用于从前向列表中删除与函数参数值相对应的所有值。此函数归类于 < forward_list>头文件。
语法:
forwardlistname.remove(value)
参数: 作为参数传递要删除元素的值。
结果: 删除与参数传递的值相等的所有容器元素。
时间复杂度: 与容器大小成线性关系。
示例:
输入:forward_list forwardlist{1, 2, 3, 4, 5};
forwardlist.remove(4);
输出:1, 2, 3, 5
输入:forward_list forwardlist{1, 2, 2, 2, 5, 6};
forwardlist.remove(2);
输出:1, 5, 6
错误和异常:
- 如果传递的值与正向列表的类型不匹配,则会显示错误。
- 如果值和正向列表的元素之间的比较不引起任何异常,则不会引发异常。
// CPP program to illustrate
// Implementation of remove() function
#include <forward_list>
#include <iostream>
using namespace std;
// Driver Code
int main()
{
forward_list<int> myforwardlist{ 1, 2, 2, 2, 5, 6, 7 };
myforwardlist.remove(2);
for (auto it = myforwardlist.begin();
it != myforwardlist.end(); ++it)
cout << ' ' << *it;
return 0;
}
输出:
1 5 6 7
forward_list::remove_if()
remove_if() 函数用于删除所有与作为函数参数给出的谓词或条件为真的列表值。函数遍历列表容器中的每个成员,并删除为谓词返回真的所有元素。此函数归类于 < forward_list>头文件。
语法:
forwardlistname.remove_if(predicate)
参数: 以函数指针或函数对象形式传递谓词。
结果: 删除所有返回true的容器元素谓词。
时间复杂度: 与容器大小成线性关系。
示例:
输入:forward_list forwardlist{1, 2, 3, 4, 5};
forwardlist.remove_if(odd);
输出:2, 4
输入:forward_list forwardlist{1, 2, 2, 2, 5, 6, 7};
forwardlist.remove_if(even);
输出:1, 5, 7
错误和异常: 异常约束无异常抛出。
// CPP program to illustrate implementation
// of remove_if() function
#include <forward_list>
#include <iostream>
using namespace std;
// Predicate implemented as a function
bool even(const int& value) { return (value % 2) == 0; }
// Driver Code
int main()
{
forward_list<int> myforwardlist{ 1, 2, 2, 2, 5, 6, 7 };
myforwardlist.remove_if(even);
for (auto it = myforwardlist.begin();
it != myforwardlist.end(); ++it)
cout << ' ' << *it;
return 0;
}
输出
1 5 7
应用remove_if(): 给定一个整数列表,从列表中删除所有质数并输出列表。
输入:2, 4, 6, 7, 9, 11, 13
输出:4, 6, 9
// CPP program to illustrate
// Application of remove_if() function
#include <forward_list>
#include <iostream>
using namespace std;
// Predicate implemented as a function
bool prime(const int& value)
{
int i;
for (i = 2; i < value; i++) {
if (value % i == 0) {
return false;
;
break;
}
}
if (value == i) {
return true;
;
}
}
// Driver Code
int main()
{
forward_list<int> myforwardlist{
2, 4, 6, 7, 9, 11, 13
};
myforwardlist.remove_if(prime);
for (auto it = myforwardlist.begin();
it != myforwardlist.end(); ++it)
cout << ' ' << *it;
return 0;
}
输出
4 6 9
让我们以表格形式比较它们的不同之处 -:
ID | forward_list::remove() | forward_list::remove_if() |
---|---|---|
1. | 它用于从容器中删除与val相等的所有元素。 | 它用于从容器中删除Predicate pred返回true的所有元素。 |
2. | 它的语法为-:remove (const value_type& val); | 它的语法为-:remove_if (Predicate pred); |
3. | 它的返回值是void类型。 | 它的返回值是void类型。 |
4. | 它需要一个参数,即要删除的元素的值。 | 它需要一个参数,即一元谓词。 |
5. | 它的复杂度是线性的。 | 它的复杂度是线性的。 |