迭代器iter(vetor iterator not incrementable)

来源:互联网 发布:nfs java 编辑:程序博客网 时间:2024/05/16 14:11

    今天在写MTGame中的updateEnemyAnimation时候遇到Expression : vetor iterator not incrementable,如下图:

    搞了本天不明白那里出错,就大概知道迭代器不能增加。查了很多资料,发觉有以下的原因:(下列内容转载)


前段时间做图算法的project,刚刚开始使用迭代器,一些细节没有主意,编译的时候就报错“list iterator not incrementable”。当时自己对迭代器的操作是erase,网上搜到得解释是:“erase中会将迭代器销毁掉.这样在erase之后,iter的指向已经乱了,debug可以看到开始是从1开始的,过后就是负多少了.所以会报错“list iterator not incrementable.”今天看书就颇详细的对迭代器做了介绍。主要有几点当时使用的时候不知道的。先做个定义vector<int>  num;vector::iterator iter;1、iterator的end操作:由end操作返回的迭代器只想vector的“末端元素的下一个”。(当初自己认为end指向的是最后一个元素=。=!)通常称为超出末端迭代器,表明它指向了一个不存在的元素。end操作返回的迭代器并不指向vector中任何实际的元素,相反,只是起一个“哨兵”的作用,表示我们已经处理完vector中所有元素。同时不能对end返回的迭代器进行解引用(即*操作)或自增操作2、*操作符:*iter返回迭代器当前指向的元素,对*iter的修改就是对迭代器所指向的元素进行修改。(当然迭代器类型非const_iterator啦,或者迭代器非const)。3、==或!=操作符来比较迭代器,如果两个迭代器对象指向同一元素,则想都,否则不等(=。=!有点废话了)4、书上给了个循环的范例,for (vector<int>::iterrator iter = num.begin();iter != num.end();++iter),书上对该处做了点解释,该for循环的效果是从num第一个元素开始顺序处理vector中每一个元素。最后,iter将指向num的最后一个元素,iter再增加1,就会与end操作的返回值相等,在这个情况下,循环终止。(PS:俺当时写的时候一直是n++的形式,估计迭代器失效跟这个也有关系=。=!)5、对于vector的循环,如果vector为空,程序也是安全的。如果num为空,则begin返回的迭代器不指向任何元素元素,由于没有元素,所以begin不指向任何元素,此时,begin和end操作返回的迭代器的值相同,因此for语句中的测试条件立即失败。最后还新认识了个const_iterator类型,迭代器只能读取容器内容,不能修改!今天看书了解到的,稍做记录!废话不少=。=!
-------------------------------------------------------------------
    最后,本人都尝试了++ietor、*操作符、const常量等问题,也尝试了第五种方法,都发觉不是,而已基本的for循环中,括号{ }范围括错了。。。
还有,这里建议一下,利用for或者do while循环写迭代器,别太依赖CCARRAY_FOREACH来遍历数组,推荐自己写个类似的功能即可,因为CCARRAY_FOREACH中不适宜进行当前删除的操作。   
------------------------------------------------------------------
(第五种方法 ,如下:)

在VC6中

list<T*> Tlist;

list<T*>::iterator  iter;

 

iter=Tlist.end(); 

iter++;

此时iter的游标位置和iter.begin()相等

但在VC6以后的版本中,比如VC2002,2005,2008中

list<T*> Tlist;

list<T*>::iterator  iter;

 

       iter=Tlist.end();

iter++;

此时iter的游标位置不是iter.begin(),而是一个空的位置

这时会报出 list iterator not incrementable 错误

解决办法如下:

list<T*> Tlist;

list<T*>::iterator  iter;

 

       iter=Tlist.end();

if(iter==Tlist.end())
    {
        iter=Tlist.begin();
    }
    else
    {
        iter++;
    }

这样做就躲避掉了VC6以后版本因为end()++不等于begin()而导致的错误

在各种版本中均使用正常不报错