Jos*_*osh 3 c++ containers list erase
我很难理解代码为什么会这样表现.首先,我已经阅读了相关的回答材料,但仍然发现了解释.所以我想知道是否有人可以用简单的方式解释这一点.
好的,所以我从列表中删除元素.
该列表包含奇数和偶数的int元素.这一部分我明白了.这是我最初编写的代码,用于从列表中删除奇数
for(list<int>::iterator i = lNo.begin(); i != lNo.end(); i++)
{
if(*i%2 == 0 )
{
lNo.erase(i);
}
else
{
cout << " " << *i;
}
}
Run Code Online (Sandbox Code Playgroud)
使用此代码,程序根本无法编译,我读了一条消息,说明程序必须关闭.
擦写功能在我编写此代码时起作用:
for(list<int>::iterator i = lNo.begin(); i != lNo.end(); i++)
{
if(*i%2 == 0 )
{
i = lNo.erase(i);
}
else
{
cout << " " << *i;
}
}
Run Code Online (Sandbox Code Playgroud)
我只需要理解为什么程序在我编码i = lNo.erase(i)而不是只用lNo.erase(i)时有效?
一个简单的简洁答案将非常感激.我知道不同的容器有不同的约束,所以我违反了原始代码的约束?
即使你的第二个代码是错误的.
正确的代码应该是这样的:
for(list<int>::iterator i = lNo.begin(); i != lNo.end(); /*NOTHING HERE*/ )
{
if(*i%2 == 0 )
{
i = lNo.erase(i);
}
else
{
cout << " " << *i;
++i; //INCREMENT HERE, not in the for loop
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,erase()擦除项目并将迭代器返回到下一个项目.这意味着,i擦除时不需要增加代码; 相反,您只需要i使用返回的值进行更新erase.
你可以erase-remove idiom用作:
lNo.erase(std::remove_if(lNo.begin(),
lNo.end(),
[](int i) { return i%2 == 0; }),
lNo.end());
Run Code Online (Sandbox Code Playgroud)