list iterator not decrementable

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

list iterator not decrementable_第1张图片

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

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

list iterator not decrementable_第2张图片

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

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

TransVector tempVet;

		list::reverse_iterator ity = vectors.rbegin();

		++ity;

		for (list::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::reverse_iterator ity = vectors.rbegin();

		++ity;

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


 

 

你可能感兴趣的:(C++学习)