为什么不能取消引用此迭代器?

时间:2019-03-17 04:19:09

标签: c++ iterator

template <class In, class V>
In my_find(In begin, In end, V val)
{
    /*
    while (begin != end)
    {
        if ((*begin) == val)
            return begin;
        ++begin;
    }
    */
    while (begin != end || *begin != val)
        ++begin;
    return begin;
}

我一直在尝试执行find,但是没有成功。我无法弄清楚为什么注释掉的代码行得通,而另一个却不断收到一条消息,说“无法取消引用超出范围向量迭代器”。

2 个答案:

答案 0 :(得分:0)

您正在使用||操作,这意味着要对while()中的条件求值,应该对两个表达式都求值。

因此,即使begin != endfalse,它仍然会评估下一个表达式为*begin != val。当begin等于结束迭代器时,这意味着您正在尝试取消引用结束迭代器,这是不安全的,并且可能导致不确定的行为。

答案 1 :(得分:0)

第二个while循环是逻辑错误。这基本上意味着如果任一条件都满足,则应执行循环。因此,它会一直从*开始递增,直到到达超出范围的点为止。 尝试更改| |与&&。这意味着要满足这两个条件,循环才能执行,这正是您注释的代码所要做的。