如果list::remove()用于不存在的元素,会返回什么?
说我有一个清单:
list<int> A { 1, 2, 3, 4};
我这样做:
A.remove(5);
这样做会返回什么?当我在 Visual Studio 中为此创建一个简单的程序时,它运行时不会出现任何错误,所以我假设它是一个法律声明。
但是,如果我想跟踪该元素是否被删除,并打印出它已被删除或该元素不存在怎么办?
例如,是否有这样的事情:
if (A.remove(5) == true) {
cout << "Element has been removed" << endl;
} else {
cout << "Element does not exist" << endl;
}
如果在第一次调用remove()函数之前存在,则无需遍历列表并将 5 与每个元素进行比较就可以完成?
回答
调用list::remove()列表中不存在的值是完全合法的。
在 C++20 之前,list::remove()没有返回值,因此知道是否删除了任何元素的唯一方法是size()在调用后检查列表的 new remove(),例如:
list<int> A { 1, 2, 3, 4};
size_t old_size = A.size();
A.remove(5);
if (A.size() < old_size) {
cout << "Element has been removed" << endl;
} else {
cout << "Element does not exist" << endl;
}
但是,在 C++20 以后,list::remove()返回删除的元素数,例如:
list<int> A { 1, 2, 3, 4};
if (A.remove(5) > 0) {
cout << "Element has been removed" << endl;
} else {
cout << "Element does not exist" << endl;
}
无论哪种方式,请注意list::remove()删除与指定值匹配的每个元素,因此它必须迭代整个列表以查找所有潜在匹配项。如果您只想删除第一个匹配项,请使用std::find()andlist::erase()代替,例如:
list<int> A { 1, 2, 3, 4};
auto iter = find(A.begin(), A.end(), 5);
if (iter != A.end()) {
A.erase(iter);
cout << "Element has been removed" << endl;
} else {
cout << "Element does not exist" << endl;
}