Векторный итератор не может быть заменен на цикл
Я использую цикл, чтобы подсчитать, сколько раз было введено слово, затем напечатайте слово и сколько раз оно было введено, которое работает, но оно никогда не печатает последнее слово, я его сортировал в алфавитном порядке. Перед тем, как напечатать последнее слово, он ошибается, говоря, что итератор не является разыменованным. Вот мой код для цикла:
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
.