list iterator not decrementable

来源:互联网 发布:鸟哥的linux私房菜 pdf 编辑:程序博客网 时间:2024/06/05 11:25

刚遇到这个“list iterator not decrementable”的问题,网上多数解决方案是这样的:

意思就是在#include "stdafx.h"的下一行加上#define _HAS_ITERATOR_DEBUGGING 0 

这样虽然能解决部分问题,但其实出现这个错误的根源在我们的代码之中,如这位仁兄所回答的一样:

意思就是,错误的根源在我们的代码中,因为C++标准里不允许迭代器超出任何容器允许的范围,所以会出错。

以我自己的代码为例,我的代码中使用到了reverse_iterator,原代码如下:

TransVector tempVet;list<TransVector>::reverse_iterator ity = vectors.rbegin();++ity;for (list<TransVector>::reverse_iterator itx = vectors.rbegin();itx != vectors.rend(); ++itx, ++ity){if (ity != vectors.rend() && IsBetterThan(*itx,*ity,preVet)){tempVet = *itx;*itx = *ity;*ity = tempVet;}}

原意是,迭代器ity在迭代器itx之前,因为是reverse_iterator,这样由后往前比较list中的元素,完成后最好的元素在list头部。

但这段代码报了“list reverse_iterator”的错误,按照上面的解释“C++标准里不允许迭代器超出任何容器允许的范围”,我检查了

代码,发现在itx 到了list的rend()时,ity已经超出rend()的范围了,因此如下修改了代码,错误就消失了。所以建议大家出现这

个错误先查看自己的代码逻辑。

TransVector tempVet;list<TransVector>::reverse_iterator ity = vectors.rbegin();++ity;for (list<TransVector>::reverse_iterator itx = vectors.rbegin(); ity != vectors.rend() && itx != vectors.rend(); ++itx, ++ity){if (IsBetterThan(*itx,*ity,preVet)){tempVet = *itx;*itx = *ity;*ity = tempVet;}}