【发布时间】:2014-10-23 13:09:51
【问题描述】:
即使我查看了该页面:http://www.cplusplus.com/reference/vector/vector/erase/, 我仍然不明白为什么在执行以下代码的最后一行时在 VS2010 上出现运行时错误('vector iterator not incrementable'):
vector<int> vec;
for(int i = 0 ; i < 10 ; i++)
vec.push_back(i);
auto itb = vec.begin()+1; // 2nd item of the vector
auto it = itb + 2; // 4th item of the vector
it = vec.erase(itb, it); // remove the 2nd & 3rd
++it; // Error happens when trying to execute this line
我认为擦除会在最后一个删除的项目之后返回一个迭代器。 所以,这里它将指向值为 3 的项目。 在这里,由于向量足够长,因此擦除不会返回 vec.end()。 从那里,我应该能够使用有效的迭代器进行迭代。 但不是! 为什么?
该代码有效:
vector<int> vec;
for(int i = 0 ; i < 10 ; i++)
vec.push_back(i);
auto itb = vec.begin()+1;
auto it = itb + 2;
vec.erase(itb, it);
it = vec.begin()+1; // re-generate an iterator from the begin() one.
++it;
编辑: 如果我在一个空的 main.cpp 文件中稍微修改“来自莫斯科的 Vlad”(见下文)的代码,那么我仍然遇到问题。所以,我想我有一个编译器问题。
代码如下:
#include <iostream>
#include <vector>
int main()
{
std::vector<int> v;
for ( int i = 0; i < 10; i++ ) v.push_back( i );
for ( auto it = v.begin(); it != v.end() ; ++it ) std::cout << *it << ' ';
std::cout << std::endl;
auto itb = v.begin() + 1;
auto it = itb + 2;
it = v.erase( itb, it );
++it; // Crash here
for ( auto it = v.begin(); it != v.end() ; ++it ) std::cout << *it << ' ';
std::cout << std::endl;
while ( it != v.end() ) std::cout << *it++ << ' ';
std::cout << std::endl;
return 0;
}
让我描述一下我的配置: 我在并行桌面 (Mac) 下运行 Win7 Ultimate 64bit,安装了 VC++6、VCS2003、VS2005、VS2008、VS2010(无 SP,.Net framework 4.5)。
【问题讨论】:
-
请记住,您的循环可能只是对
std::iota的调用。 -
该代码没有问题。你确定它是你正在运行的那个吗?
-
如果程序在上面使用 sn-p 的那一行崩溃,您可能在其他地方有未定义的行为会破坏内存。
-
你检查
it != vec.end()以防万一吗?擦除后尝试打印it。 -
你在使用奇怪的编译器吗?否则你会在其他地方破坏迭代器。