迭代器擦除矢量中的元素无效,但它不会崩溃
erase an element in vector by the iterator invalid, but it DOESN'T crash
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;
}
我敢肯定它是.它应该像下面这样,否则它会崩溃。
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++入门书,并在谷歌上搜索它,仍然感到困惑。
从擦除:
使擦除点处或之后的迭代器和引用失效,包括 end(( 迭代器。
基本上,这意味着第一个代码片段是未定义的行为。
而且,由于它是未定义的行为,任何事情都可能发生(崩溃不是必需的,程序可能会像您预期的那样运行,直到将来的某个时刻突然崩溃(。
相关文章:
- 当回溯以零开始时,如何调试崩溃
- Openssl 1.1.1d无效使用不完整的类型"struct dsa_st"
- 无法访问嵌套类.类的使用无效
- 内联映射初始化的动态atexit析构函数崩溃
- 执行函数时导致崩溃的变量
- 程序崩溃并显示"std::out_of_range"错误
- Android (ART) 崩溃并显示错误 JNI 在应用程序中检测到错误:jstring 是无效的本地引用
- 由于调用 std::condition_variable 后参数无效而导致应用程序崩溃
- 迭代器擦除矢量中的元素无效,但它不会崩溃
- 无效输入导致程序崩溃.有没有办法忽略它
- Android Oreo 8.0本机C 崩溃:无效的PTHREAD_T传递给LIBC
- 使用无效套接字调用boost::asio::write()使我的Blackberry 10应用程序崩溃
- 为什么会崩溃?对函数中静态变量的c++引用无效
- 如何确保当无效字符串作为参数传递时posix_time_zone构造函数不会崩溃
- 导致应用程序强制崩溃的指针无效
- 子弹物理由于无效引用而崩溃
- 删除时指针崩溃无效,但指针不同
- 原生Android崩溃-无效位图
- 处理无效指针的崩溃
- 无效异常展开导致崩溃