Почему итерация обратного списка не отображает узел, вставленный перед заголовком списка? - PullRequest
0 голосов
/ 13 апреля 2020

Я борюсь со следующим кодом:

 list<int> numbers;
 numbers.push_back(1);
 numbers.push_back(2);
 numbers.push_back(3);
 numbers.push_front(0);


 list<int>::iterator it = numbers.begin();
 numbers.insert(it, 100); 

 for(list<int>::iterator it=numbers.begin(); it != numbers.end(); it++)
 {
    cout << *it << endl;
 }

Вывод >> 100 0 1 2 3

Но при обратной итерации:

list<int>::iterator itBack = numbers.end();

for(; itBack != numbers.begin(); itBack--)
{
   cout << *itBack << endl;
}

Вывод >> 5 3 2 1 0

Откуда эти 5? а почему нет элемента с номером 100?

Спасибо заранее

1 Ответ

0 голосов
/ 13 апреля 2020

Проблема, с которой вы столкнулись, заключается в том, что end() не возвращает иттератор, указывающий на последний элемент в вашем списке, а скорее указывает на элемент один после последнего элемента. в вашем списке. Это позволяет следующему коду

for(list<int>::iterator it=numbers.begin(); it != numbers.end(); it++)

запускаться для каждого элемента в вашем списке и завершаться только тогда, когда итератор указывает за на конец вашего списка ... следовательно, печатая каждый элемент. Для броска в обратном порядке

itBack != numbers.begin()

Это станет неверным , когда вы достигнете первого элемента своего списка и не будете его преследовать. Попытка почтить end(), как упоминалось в комментариях, ведет к неопределенному поведению, поскольку вы эффективно индексируете вне массива.

...