BUG_vector iterator not dereferencable

1问题: bug提示图下图所示:

  

2. 分析

   前前后后核实程序没有错误,退后根据bug提示信息

 vector<Point>::iterator itPoint = tempSortedList.begin();

  while (itPoint->y >= yLine && itPoint->y < yLine+MOVEUNION && itPoint != tempSortedList.end() )   

  在vector的源文件中

  

   提示内容的意思是:“vector迭代器不可以去引用操作”。

  但是在while条件判定中添加了:itPoint != tempSortedList.end(),迭代器的到达末尾的判定。

  唯一可能的原因是,当到达末尾后,外部又从新进入whlie条件判定:

  itPoint->y >= yLine && itPoint->y < yLine+MOVEUNION && itPoint != tempSortedList.end()

  但是首先进行的是:itPoint->y,取引用操作,因为此时迭代器指向了tempSortedList.end(),所以抛出此异常

3. 修改

   首先进行迭代器是否到末尾的判定,然后在进行其他迭代器操作,这是基于如果到达末尾迭代器位置,则不进行下述判定。

while (itPoint != tempSortedList.end() && itPoint->y >= yLine && itPoint->y < yLine+MOVEUNION)

  程序运行结果正常。

4. 心得

  写程序要用心考虑,思维缜密,考虑周全!

时间: 2024-09-29 16:16:09

BUG_vector iterator not dereferencable的相关文章

iterator not dereferencable问题

STL中的迭代器总是出现各种问题,这个是我在打表达式求值时碰到的... 综合网上的答案,一般来说有两种情况: 第一:访问了非法位置. 一般来说可能在queue为空时取front(),rear(),或者用list时误访最后一个结点,再或是在stack为空时进行了top(),pop()操作等. 一般来说用一下方法解决即可: (1)在访问链表元素时判断当前迭代器是否指向链表尾 1 list<Boom*>::iterator ite=m_listBoom.begin(); 2 while(ite!=m

C++ STL之迭代器注意事项

1.两个迭代器组成的区间是前闭后开的 2.如果迭代器的有效性,如果迭代器所指向的元素已经被删除,那么迭代器会失效 http://blog.csdn.net/hsujouchen/article/details/8987233 3.迭代器指向的内容为空的时候(如已经指向end的时候)是不能访问值的,否则运行会崩溃(报错内容iterator not dereferencable) 1 string str_in; 2 cin>>str_in; 3 string ::iterator it; 4 i

转:STL迭代器失效问题

最近在项目开发中,遇到一个异常,经过测试,发现是迭代器失效问题,于是稍微总结了一下. vector迭代器失效测试: 测试程序: void vectorTest(){    vector<int> container;    for (int i = 0; i < 10; i++)    {        container.push_back(i);    } vector<int>::iterator iter;     for (iter = container.begi

Iterator接口。集合输出

在集合中支持以下几种方式. iterator ListIterator foreach输出 emumeration输出. 集合输出的标准操作: 集合输出的时候必须形成以下的思路:只要碰到了集合输出的操作,就一定使用iterator接口,这是最重要的标准. iterator接口的操作原理: iterator是专门的迭代输出接口,所谓的迭代输出就是将元素一个个进行判断,判断其是否有内容,如果有内容,则把内容输出. 对于iterator而言,其本身是一个借口,所以要想实例化,需要必须依靠collect

Java源码分析:深入探讨Iterator模式

作者:兄弟连 java.util包中包含了一系列重要的集合类.本文将从分析源码入手,深入研究一个集合类的内部结构,以及遍历集合的迭代模式的源码实现内幕. 下面我们先简单讨论一个根接口Collection,然后分析一个抽象类AbstractList和它的对应Iterator接口,并仔细研究迭代子模式的实现原理. 本文讨论的源代码版本是JDK 1.4.2,因为JDK 1.5在java.util中使用了很多泛型代码,为了简化问题,所以我们还是讨论1.4版本的代码. 集合类的根接口Collection

LeetCode OJ:Peeking Iterator(peeking 迭代器)

Given an Iterator class interface with methods: next() and hasNext(), design and implement a PeekingIterator that support the peek() operation -- it essentially peek() at the element that will be returned by the next call to next(). Here is an exampl

LeetCode——Peeking Iterator

Description: Given an Iterator class interface with methods: next() and hasNext(), design and implement a PeekingIterator that support the peek() operation -- it essentially peek() at the element that will be returned by the next call to next(). Here

Java Iterator和增强for循环 for each详解

Iterator是Java中的一个迭代器接口(Interface),用来提供标准的Java迭代器 Iterator支持泛型因为集合(Collection)类可以装入的类型是不确定的,从集合中取出的都是Object类型,加入泛型,就是告诉编译器确定要装入的对象类型,取值时就无需强制转换了. for each 是 Java 5 中新增的一个循环结构,本质上是一个Iterator,特点是可以用来遍历集合元素而不用考虑集合下标. 综合实例: package net.csdn.shf4715; impor

一大波Java来袭(六)——Java集合之Collection和Iterator接口

本文主要介绍Collection和Iterator接口. 一.Collection和Iterator接口 Collection接口是List.Set..Queue的父接口. Collection  c = new ArrayList(); 父类指向子类对象!优点:多态.动态链接.向上转型. 面向接口编程,被调用者对于调用者是完全透明的,可以随意替换子类,屏蔽了子类特有的东西. Demo:详细请参加:Java API文档 二.如何依次遍历集合中的元素? 普通情况下,当我们把一个对象"丢进"