刚遇到这个“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;
}
}