更改迭代器比较时,矢量迭代器不可解除引用

时间:2012-01-03 01:24:37

标签: c++ visual-studio-2010 stl

以下代码段在运行时提供错误消息:

调试断言失败:向量迭代器不可解除引用

 for(it=stat1vec.begin(); *(it)>=investigated_stat; it++, positioner++)
    {


        if(*it==investigated_stat)
            equalwith++;

    }

更改为:

for(it=stat1vec.begin(); *(it)==investigated_stat; it++, positioner++)
        {


            if(*it==investigated_stat)
                equalwith++;

        }

代码完美无缺。

所有已完成的工作是将> =更改为==

为什么会这样?

非常感谢

2 个答案:

答案 0 :(得分:3)

在解除引用之前,您应该测试迭代器是否是有效的迭代器。你的循环将一直持续到*it < investigated_stat,但是当没有任何元素是>= investigated_stat而你迭代超过向量的末尾时它就不会停止。

for循环中的测试应该是

it != stat1vec.end() && *it >= investigated_stat

这使得稍加修改for

for(it = stat1vec.begin(); it != stat1vec.end() && *it >= investigated_stat; ++it, ++positioner)
    if(*it == investigated_stat)
        ++equalwith;

答案 1 :(得分:2)

似乎在到达向量末尾之前的某个时刻,您将零分配给*(it):此时循环终止。逻辑比较试图找到不同的东西 - 并且失败了。我假设您打算在第二个循环中编写==

请注意,迭代序列的惯用方法(不使用算法时)看起来像这样:

for (it = v.begin(), end = v.end(); it != end /* possible additional conditions */; ++it)
{
    ...
}