可能重複:
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函數,因爲它們重新排列鏈接而不是移動元素,所以它更有效。 –