Ошибка «Отладка подтверждения» выдается при зацикливании итератора - PullRequest
0 голосов
/ 14 декабря 2018

Окно ошибок выскакивает сразу, программа вылетает и т.д.

Код:

void sort_star(vector<string>& product, vector<double>& star_rating) 
{
  vector<string>::iterator piter;
  vector<double>::iterator cycler;
  piter = product.begin();
  cycler = star_rating.begin();

  while (piter != product.end() && cycler != star_rating.end()) 
  {
    ++piter; ++cycler;

    cout << "/n|" << *piter << "|"; 
    cout << *cycler << " Stars";
  }
}

Да, так что я довольно новичок и не слишком много знаю о C ++.Хорошее объяснение будет высоко ценится!

Ответы [ 2 ]

0 голосов
/ 14 декабря 2018

В цикле while вы увеличиваете свои итераторы ПЕРЕД их использованием

...
while (piter != product.end() && cycler != star_rating.end()) {
    ++piter; ++cycler; <--- HERE

Это означает две вещи:

  • вы пропускаете первый элемент
  • вашего итераторадостигает конца (), который является указателем на PAST-END-POSITION и не является допустимым элементом см. здесь .

FIX Инкремент в конце циклавот так:

while (piter != product.end() && cycler != star_rating.end()) {
    cout << "/n|" << *piter << "|"; 
    cout << *cycler << " Stars";

    ++piter; ++cycler;
}
0 голосов
/ 14 декабря 2018

Вы разыменовываете итераторы после приращения.Это

  • пропустит первые печатаемые элементы
  • попытается разыменовать итератор std::vector::end.Очевидно, std::vector::end:

    Возвращает итератор для элемента, следующего за последним элементом
    контейнера.Этот элемент действует как заполнитель;попытка
    доступа к нему приводит к неопределенному поведению .

Вы могли бы сделать это в цикле for следующим образом:

for ( ; piter != product.end() && cycler != star_rating.end(); ++piter, ++cycler) 
{ // ^^                                                       ^^^^^^^^^^^^^^^^^^

    cout << "/n|" << *piter << "|" << *cycler << " Stars";
}
...