Векторный итератор не может быть заменен на цикл

Я использую цикл, чтобы подсчитать, сколько раз было введено слово, затем напечатайте слово и сколько раз оно было введено, которое работает, но оно никогда не печатает последнее слово, я его сортировал в алфавитном порядке. Перед тем, как напечатать последнее слово, он ошибается, говоря, что итератор не является разыменованным. Вот мой код для цикла:

for (vector<string>::iterator it = v.begin() ; it != v.end(); ++it)
    {
        if (*it == *(it+1))
        {
        count++;
        }
        else if (*it != *(it+1))
        {
                count++;
            cout << *it << " ---- " << count << endl;
            count=0;
        }
    }

Ответ 1

В вашем коде есть поведение undefined - Представьте, что it указывает на последний элемент v, тогда вы пытаетесь разыменовать v.end() в *(it+1)

if (*it != *(it+1)

Итератор STL, конец не указывает на последний элемент; end() возвращает итератор, который представляет конец элементов в контейнере. Конец - это позиция за последним элементом. Такой итератор называется также итератором прошедшего конца.

Таким образом, begin() и end() определяют полуоткрытый диапазон, включающий первый элемент, но исключает последний

 --------------------------------
 |  |   |   |   |   |   |   |   |
 --------------------------------
  /\                               /\      
begin()                            end() 

Для чего вы пытаетесь достичь, посмотрите std:: adj_find

auto it = std::adjacent_find(v.begin(), v.end());

if (it != v.end())
{
  count ++;
}
else
{
   cout << *it << " ---- " << count << endl;
}

Ответ 2

Когда вы находитесь на последнем слове и пытаетесь выполнить:

if (*it == *(it+1))

it+1 указывает на v.end(), который является допустимым итератором, но не является разборчивым. Отсюда ошибка.

Ответ 3

Если это один до итератора конца, у вас есть проблема: *(it+1), поскольку это пытается разыменовать конечный итератор, что является недопустимым.

Я не уверен, что вы хотите, чтобы ваша логика делала в этом случае, но вы можете проверить это с помощью if (it+1 != v.end()), прежде чем делать свои вещи.

Ответ 4

когда it == v.end() - 1, вы чувствуете (it+1) так v.end(), и deference v.end() - это поведение undefined.

Ответ 5

Потому что, когда it близок к концу, it+1 заканчивается, и вы пытаетесь разыменовать его в операторе if.