可能重复:
How to filter items from a std::map?
std::list::erase not working删除/从STD擦除::列表
我有一些无聊的问题关于删除,擦除的std ::名单。
我已经定义的类为:
class CBase
{
public:
CBase(int i): m(i)
{};
int m;
};
然后,我将其设置为:
list<CBase> ml;
CBase b1(1);
CBase b2(2);
CBase b3(3);
CBase b4(4);
ml.push_back(b1);
ml.push_back(b2);
ml.push_back(b3);
ml.push_back(b4);
我可以擦除其具有m == 2由项;
for (list<CBase>::iterator it=ml.begin(); it!=ml.end(); ++it)
{
if (it->m == 2)
{
ml.erase(it--);
}
}
// show what we have now:
for (list<CBase>::iterator it=ml.begin(); it!=ml.end(); it++)
{
cout << it->m;
}
但是,如果我做的:
for (list<CBase>::iterator it=ml.begin(); it!=ml.end(); it++)
{
if (it->m == 2)
{
ml.erase(it);
it--;
}
}
会有例外。为什么是这样?
如果我想删除B3,
ml.remove(B3);
不会编译。我在网上找到的所有示例使用list<int>
,并且如果mylist is list<int>
调用mylist.remove(3)
没有问题。我怎样才能使它工作?
DUP:http://stackoverflow.com/questions/12666869/stdlisterase-not-working – Csq
的STL具有只是反正这样的情况下是非常有效的算法:HTTP ://en.cppreference.com/w/cpp/algorithm/remove – SirDarius
@SirDarius:'std :: list'有它自己的remove/remove_if函数,因为它们重新排列链接而不是移动元素,所以它更有效。 –