int main()
{
vector<int> v;
v.reserve(10);
for(int i=0;i<10;i++)
v.push_back(i);
for(vector<int>::const_iterator iter=v.begin();iter!=v.end();iter++) {
if(*iter==5)
v.erase(iter);
}
for(vector<int>::const_iterator iter=v.begin();iter!=v.end();iter++)
cout<<*iter<<endl;
return 0;
}我确信热核实验堆的.It应该是这样的,否则它会崩溃。
for(vector<int>::const_iterator iter=v.begin();iter!=v.end();) {
if(*iter==5)
iter=v.erase(iter);
else
iter++;
}然而,当我运行第一个程序时,它输出了:0,1,2,3,4,6,7,8,9。我一遍又一遍地阅读C++入门,并用谷歌搜索它,仍然感到困惑。
发布于 2018-02-01 23:35:08
来自erase
会在擦除点或之后使迭代器和引用失效,包括end()迭代器。
基本上,这意味着第一个代码片段是未定义的行为。
而且,由于它是未定义的行为,任何事情都可能发生(不需要崩溃,程序可能会像你预期的那样运行,直到将来它突然崩溃)。
https://stackoverflow.com/questions/48566290
复制相似问题