为什么在vector末尾.end()前插入元素以后,迭代器不可以++向后移动?

sk609_king 2017-02-21 09:56:27
代码如下,
按理说在l_vData.end()前插入元素i后,it++,下次就又可以在l_vData.end()前插入元素了,但是如果用it++,程序运行会出错。
#include <vector>
#include <iostream>

void main(int argc, char** argv)
{
std::vector<int> l_vData;
std::vector<int>::iterator it = l_vData.end();
for(int i = 0; i < 10; i++)
{
l_vData.insert(it, i);
// it++; // 为什么这样会运行报错
it = l_vData.end(); // 这样没问题
std::cout << l_vData[i] << std::endl;
}

system("pause");
return;
}
...全文
710 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
fefe82 2017-02-21
  • 打赏
  • 举报
回复
it = l_vData.insert(it, i); it++; // 为什么这样会运行报错
  • 打赏
  • 举报
回复
insert之后迭代器之后就失效了,需要重新获取一次。
小灸舞 2017-02-21
  • 打赏
  • 举报
回复
众所周之当使用一个容器的insert或者erase函数通过迭代器插入或删除元素"可能"会导致迭代器失效,因此很多建议都是让我们获取insert或者erase返回的迭代器,以便用重新获取新的有效的迭代器进行正确的操作。
当我们插入一个元素时它的预分配空间不够时,它会重新申请一段新空间,将原空间上的元素 复制到新的空间上去,然后再把新加入的元素放到新空间的尾部,以满足vector元素要求连续存储的目的。而后原空间会被系统撤销或征做他用,于是指向原 空间的迭代器就成了类似于“悬垂指针”一样的东西,指向了一片非法区域。如果使用了这样的迭代器会导致严重的运行时错误就变得很自然了。这也是许多书上叙 述vector在insert操作后“可能导致所有迭代器实效”的原因。
flying_music 2017-02-21
  • 打赏
  • 举报
回复
任何insert或push操作都可能导致迭代器失效。当编写循环将元素插入到vector或deque容器中时,程序必须确保迭代器在每次循环后都得到更新。

5,530

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 模式及实现
社区管理员
  • 模式及实现社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧