Почему возникает ошибка с итератором?

#include <string>
#include <vector>

using namespace std;

int main()
{
  vector<string> words;
  vector<string>::iterator it;
  int Pos;

  string w1 = "word1", w2 = "word2"; 
  words.push_back(w1);
  //words.push_back(w2); //optional

  it = words.begin();
  if ((it++) != words.end())
    if (*it == "word2")
    {
      Pos = 2;
      //do something
    }

  return 0;
}

Ошибка при попытке обратиться к *it для сравнения с "pattern".
  • Вопрос задан
  • 191 просмотр
Пригласить эксперта
Ответы на вопрос 1
@sborisov
У вас проблема в этой строке:
if ((it++) != words.end())
замените её на эту:
if ((++it) != words.end())
А лучше перепишите с циклом while (я привёл код), а ещё лучше используйте for range цикл.

Объяснение:
вы сначала сравнивате временный объект, который вернул (it++) c end(), при этом сам итератор it уже сдвинут оператором ++, и смотрит на end(), который вы пытаетесь разыменовать, что запрещено.
Посмотрите здесь, что возвращают операторы ++ и -- при пост и пре инкрементах.
en.cppreference.com/w/cpp/concept/ForwardIterator
en.cppreference.com/w/cpp/concept/BidirectionalIterator

auto it = words.begin();
  while(it != words.end()){	
    if (*it == "word2")
    {
      Pos = 2;
      //do something
    }
   ++it;	
   }
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы