Почему я не могу разыменовать этот итератор? - PullRequest
1 голос
/ 17 марта 2019
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;
}

Я пытался реализовать поиск, но без особого успеха. Я не могу понять, почему закомментированный код работает, в то время как другой продолжает получать сообщение, говорящее «невозможно разыменовать вне диапазона итератор вектора».

Ответы [ 2 ]

0 голосов
/ 17 марта 2019

Второй цикл while является логической ошибкой.По сути, это означает, что если какое-либо условие удовлетворяется, цикл должен быть выполнен.Поэтому он продолжает увеличиваться, * начинаться до тех пор, пока не достигнет точки, в которой он выходит за пределы диапазона.Попробуйте изменить ||с &&.Это будет означать, что оба цикла должны быть выполнены для выполнения цикла, что в точности соответствует вашему закомментированному коду.

0 голосов
/ 17 марта 2019

Вы используете операцию ||, которая означает, что для условия в while() должны быть оценены оба выражения.

Поэтому, даже если begin != end равно false, оно все равно будет вычислять следующее выражение, которое *begin != val. Когда начало равно автономному итератору, это означает, что вы пытаетесь разыменовать внешний итератор, который небезопасен и потенциально может привести к неопределенному поведению.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...