从标准列表中删除元素

Removing element from the standard list

本文关键字:删除 元素 列表 标准      更新时间:2023-10-16

假设我有以下类

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() 函数时出错,我应该准确传递什么才能从列表中删除此元素?

你只是误会了eraseremove.根据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.