从标准列表中删除元素
Removing element from the standard list
假设我有以下类
class Human
{
public:
Human();
Human(string,int);
virtual ~Human();
string getName();
protected:
private:
string name;
int staj;
};
我创建了包含 2 个我推入的元素的列表
list<Human> mylist;
Human x ("Mike",13);
Human y("pavlek",33);
如果存在名为"Mike"的元素,我正在尝试删除它,我尝试像这样删除它:
for(list<Human>::iterator it=mylist.begin();it!=mylist.end();++it)
{
if(it->getName()=="Mike")
{
mylist.remove(it);
cout<< "removed";
cout<<it->getName();
}
}
但是我在将值传递给 remove()
函数时出错,我应该准确传递什么才能从列表中删除此元素?
你只是误会了erase
和remove
.根据C++引用,remove
用于从列表中删除值等于给定参数的所有元素。另一方面,erase
删除给定其位置的单个元素或给定开始和结束位置的一系列元素。
如果您只需要删除包含 "Mike"
作为其名称的第一个元素,只需执行以下操作:
for(list<Human>::iterator it=mylist.begin();it!=mylist.end();++it)
{
if(it->getName() == "Mike")
{
mylist.erase(it);
break;
}
}
请注意,使用擦除后,您的迭代器将失效。你可以通过使用返回值 erase
来规避它,这是下一个有效的迭代器值。如果列表可能包含名称为 "Mike"
的多个元素,则此详细信息非常重要。
Matheus Portela的解决方案是旧的C++98方法。现在容易多了:
mylist.remove_if( [](Human const& h){return h.getName()=="Mike";} );
这里的条件是 [](Human const& h){return h.getName()=="Mike";}
.这是一个 lambda 表达式,如果应该删除Human h
,则返回 true。您可以在那里测试任何其他属性或属性组合。lambda 的{ }
部分是一个真正的函数体;你甚至可以在那里有for循环:
其他例子:
mylist.remove_if( [](Human const& h){return h.getName().size() > 4; } );
mylist.remove_if( [](Human const& h) {
for (char c: h.getName())
if (c=='i') return true; // remove if name contains an i
return false; } );
请注意,后者会更容易使用std::any_of
.
相关文章:
- 如何从存储在std::映射中的std::集中删除元素
- 从嵌套在std::映射中的std::列表中删除元素的最佳方式
- 从矢量中删除元素后出现隔离错误
- 如何使用remove_if从矢量中删除元素
- 如何从使用 for 循环中的矢量大小的矢量中删除元素
- C++映射不删除元素
- 如何从标准::元组中删除元素?
- 在动态数组中添加/删除C++元素
- 如何通过比较彼此的成员从QStringList中删除元素
- 如何修复从矢量中删除元素的错误?
- 从 std::set 中删除元素,同时在 C++17 中迭代该元素
- 使用remove_if从矢量中删除元素
- 用C++从三维矢量中删除元素
- 从对象数组中删除元素
- 如何在不使用 vector::erase() 的情况下编写自定义 Vector 方法来删除元素?
- C++ - 按自定义数据类型向量的值删除元素
- 从任意容器中廉价删除元素的惯用方法?
- 从数组中删除元素不起作用的函数
- 删除元素 BST
- 从向量中删除元素时未处理的异常