假设我有以下课程
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();
}
函数时遇到错误,为了从列表中删除这个元素,我应该准确传递什么?
答案 0 :(得分:2)
您完全误认为erase
和remove
。根据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
请注意,使用{ }
后者会更容易。