【发布时间】:2020-02-25 16:22:41
【问题描述】:
很明显,这段代码会产生段错误。
#include <iostream>
#include <string>
#include <vector>
int main()
{
std::vector<int> ints;
ints.push_back(5);
std::vector<int>::iterator it;
for(it = ints.begin(); it != ints.end(); ++it){
std::cout << *it;
it = ints.erase(it);
}
}
如果我们删除++it并添加一个擦除条件,我们可以避免这个错误。但问题的真正原因是什么?在我们的循环中,我们说,对于迭代器的开始,直到它到达结束,递增一,打印出值然后擦除它。是不是因为 ++it 在“结束”时被调用,而在这种情况下,我们已经删除了下一个(唯一的)值?
【问题讨论】:
-
这对我一点帮助都没有。
-
确实如此。未定义的行为意味着任何事情都可能发生,包括从你鼻子里飞出的恶魔。这正是该术语的起源,以强调这一点。可以肯定的是,您永远不会忘记这句话,并且您将永远铭记于心。
-
@errno_44 在最后一次迭代中
ints.erase(it);返回ints.end()。然后for循环尝试++那个不允许的迭代器。 -
@SamVarshavchik 抱歉,这对我来说毫无意义。
-
我从不喜欢擦除正在迭代的容器的元素..
标签: c++