矢量擦除迭代
我有这样的代码:矢量擦除迭代
int main()
{
vector<int> res;
res.push_back(1);
vector<int>::iterator it = res.begin();
for(; it != res.end(); it++)
{
it = res.erase(it);
//if(it == res.end())
// return 0;
}
}
“一个随机访问迭代指向的元素的新位置,然后该函数调用擦除的最后一个元素,这是如果操作该载体端擦除序列中的最后一个元素。“
此代码崩溃,但如果我使用if(it == res.end()),然后返回它的作品。怎么来的? for循环现金的res.end()所以不等于运营商失败?
res.erase(it)
总是返回下一个有效的迭代器,如果你删除最后一个元素,它会指向.end()
在循环++it
始终调用结束,所以你增加.end()
这是不允许的。
简单的.end()
检查仍留有一个bug不过,因为你总是(从.erase()
由环it
被“递增”通过回,然后再)跳过每次迭代的元素
你可能想要的东西像:
while (it != res.end()) {
it = res.erase(it);
}
删除每个元素
(的完整性:我想这是一个简单的例子,如果你只是想每一个元素去无夏晖以执行对其的操作(例如,删除),你应该简单地调用res.clear()
)
当你只有有条件地删除元素,你可能要像
for (; it != res.end();) {
if (condition) {
it = res.erase(it);
} else {
++it;
}
}
不要删除,然后递增迭代器。没有必要增加,如果你的向量有一个奇怪的(甚至,我不知道)数量的元素,你会错过向量的结尾。
it ++指令在块的末尾完成。因此,如果你正在擦除最后一个元素,那么你尝试增加指向一个空集合的迭代器。
您在for循环的循环表达式的(空)容器末尾增加it
。
for(; it != res.end();)
{
it = res.erase(it);
}
,或者更一般:
for(; it != res.end();)
{
if (smth)
it = res.erase(it);
else
++it;
}
下也似乎工作:
for (vector<int>::iterator it = res.begin(); it != res.end(); it++)
{
res.erase(it--);
}
不知道是否有任何缺陷在这?
if(allPlayers.empty() == false) {
for(int i = allPlayers.size() - 1; i >= 0; i--)
{
if(allPlayers.at(i).getpMoney() <= 0)
allPlayers.erase(allPlayers.at(i));
}
}
这适用于我。并且不需要考虑索引已经被擦除。
作为修改crazylammer的回答,我经常使用:
your_vector_type::iterator it;
for(it = res.start(); it != res.end();)
{
your_vector_type::iterator curr = it++;
if (something)
res.erase(curr);
}
这样做的好处是,你不必担心忘记增加你的迭代器,使其不太错误容易,当你有复杂的逻辑。在循环内部,curr永远不会等于res.end(),并且它将在下一个元素处,无论您是否从矢量中删除它。
为什么不使用`res.clear()`? – Benoit 2011-01-10 10:25:11
相似问题:http://*.com/questions/347441/erasing-elements-from-a-vector – Naveen 2011-01-10 10:29:01
因为这只是代码的简化,我并不是要删除真实代码中的所有元素 – hidayat 2011-01-10 10:37:21