从标准列表中删除元素

时间:2017-05-22 23:21:59

标签: c++

假设我有以下课程

select date, id, listagg(event,'|') within group(order by date,id) 
from my_table 
group by date,id

我创建了包含2个元素的列表

class Human
 {
public:
    Human();
    Human(string,int);
    virtual ~Human();
    string getName();

protected:

private:
    string name;
    int staj;
 };

我想删除如果有名字的元素" Mike",我试图将其删除:

  list<Human> mylist;
  Human x ("Mike",13);
  Human y("pavlek",33);

}

但是我在将值传递给 for(list<Human>::iterator it=mylist.begin();it!=mylist.end();++it) { if(it->getName()=="Mike") { mylist.remove(it); cout<< "removed"; cout<<it->getName(); } 函数时遇到错误,为了从列表中删除这个元素,我应该准确传递什么?

2 个答案:

答案 0 :(得分:2)

您完全误认为eraseremove。根据C ++参考,remove用于remove from the list all elements whose values are equals to the given parameter。另一方面,erase removes a single element given its position or a range of elements given the start and end positions

如果您只需删除包含"Mike"的第一个元素作为其名称,只需执行以下操作:

for(list<Human>::iterator it=mylist.begin();it!=mylist.end();++it)
{
    if(it->getName() == "Mike")
    {
        mylist.erase(it);
        break;
    }
}

请注意after using erase, your iterator will be invalidated。您可以使用返回的erase值来绕过它,这是下一个有效的迭代器值。如果您的列表可能包含名称为"Mike"的多个元素,则此详细信息非常重要。

答案 1 :(得分:0)

Matheus Portela的解决方案是旧的C ++ 98方法。现在它变得容易多了:

size(x)

这里的条件是[n*m 1]。这是一个lambda表达式,如果应该删除mylist.remove_if( [](Human const& h){return h.getName()=="Mike";} ); ,则返回true。您可以在那里测试任何其他属性或属性组合。 lambda的[](Human const& h){return h.getName()=="Mike";}部分是一个真正的函数体;你甚至可以在那里使用for循环:

其他例子:

Human h

请注意,使用{ }后者会更容易。