关于 vector iterator not dereferencable的简单问题!

kongling12 2014-02-16 06:49:19

vector<int>::iterator i;
vector<int>::iterator *it = new vector<int>::iterator;
for(*it = vec->begin(); *it != vec->end(); (*it)++)
{
if (**it == 15)
{
i = *it;
vec->erase(i);
// *it = vec->begin();
cout<<"after erase 5 the iterator is "<<**it<<endl;//这行代码会崩溃

代码如上,我看了**it的值,只是自动变成了下一个值而已,为什么运行的时候会提示vector iterator not dereferencable呢? 谢谢!
...全文
1575 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
nalisaki 2014-02-17
  • 打赏
  • 举报
回复
在遍历时动态地改变容器大小的正确做法应该是 it = vec.erase(it);
baichi4141 2014-02-17
  • 打赏
  • 举报
回复
从实现上,你删除了一个元素,后面的元素自然向前移动了,那么原本指向删除那个元素的迭代器自然就指向下一个元素了 但从规定上,一旦删除了这个迭代器指向的元素,那么指向这个元素和后面的元素的所有迭代器都会失效 你觉得规定不重要?那我告诉你,只要不违反规定,编译器可以任意实现,你觉得是规定可靠还是实现可靠?你想不想你的代码在这个编译器上能用,在那个编译器上就崩溃? 代码出问题,可能是删除了最后一个元素,也可能是IDE比较智能自动记下了该迭代器已删除 不管怎么样,学编程以语言标准为准,而不是以你调试时看到的值为准,因为只要不违反语言标准,编译器爱怎么玩就怎么玩
xiaohuh421 2014-02-17
  • 打赏
  • 举报
回复
vec->erase(i); 已经被你删除了, 你后面再想去访问它, 确实该看看书. 别人给你建议, 不虚心接受, 还觉得自己提问是大爷一样. 我觉得这种态度确实不是一个提问者的态度.
buyong 2014-02-17
  • 打赏
  • 举报
回复
除了上面说的,你的iterator用new看上去也很古怪。
kongling12 2014-02-16
  • 打赏
  • 举报
回复
引用 1 楼 taodm 的回复:
你需要认真去啃《effective stl》 乱用stl是会死相很难看的。
哥。。。我知道你是牛人。。。但是你这样讲不也是没有意义么? 指点下吧,别动不动就说看书,看nb的书。看书我也知道,但是现在不是想通过这种提问的方式解决么。
taodm 2014-02-16
  • 打赏
  • 举报
回复
你需要认真去啃《effective stl》 乱用stl是会死相很难看的。

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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