我有这个代码:
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;
}
}
“一个随机访问迭代器,指向函数调用删除的最后一个元素之后的元素的新位置,如果操作删除了序列中的最后一个元素,则该位置是 vector 结束。”
此代码崩溃,但如果我使用 if(it == res.end())
部分然后返回,它可以工作。怎么来的? for 循环是否缓存了 res.end()
以使不等于运算符失败?
最佳答案
res.erase(it)
总是返回下一个有效的迭代器,如果你删除最后一个元素,它将指向 .end()
在循环结束时 ++it
总是被调用,所以你增加 .end()
这是不允许的。
只是检查 .end()
仍然会留下一个错误,因为您总是在每次迭代时跳过一个元素(it
通过从 .erase()
,然后再循环一次)
你可能想要这样的东西:
while (it != res.end()) {
it = res.erase(it);
}
删除每个元素
(为了完整性:我假设这是一个简化的示例,如果您只是希望每个元素都消失而不必对其执行操作(例如删除),您应该简单地调用 res.clear()
)
当你只有条件地删除元素时,你可能想要类似的东西
for ( ; it != res.end(); ) {
if (condition) {
it = res.erase(it);
} else {
++it;
}
}
关于c++ - vector 删除迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4645705/