Почему push_back в std::list изменяет обратный итератор, инициализированный с помощью rbegin?

Согласно некоторой документации STL, которую я нашел, вставка или удаление элементов в std::list не делает итераторы недействительными. . Это означает, что разрешен цикл по списку (от begin()до end()), а затем добавлять элементы с помощью push_front.

, в следующем коде я инициализирую список элементами a, b и c, затем перебираю его и выполняю push_front элементов. Результат должен быть cbaabc, что я и получаю:

std::list<std::string> testList;
testList.push_back("a");
testList.push_back("b");
testList.push_back("c");

for (std::list<std::string>::iterator itList = testList.begin(); itList != testList.end(); ++itList)
   testList.push_front(*itList);

for (std::list<std::string>::const_iterator itList = testList.begin(); itList != testList.end(); ++itList)
   std::cout << *itList << std::endl;

Когда я использую обратные итераторы (цикл от rbegin()до rend()) и использую push_back, я бы ожидать аналогичного поведения, т.е. результата abccba. Однако я получаю другой результат:

std::list<std::string> testList;
testList.push_back("a");
testList.push_back("b");
testList.push_back("c");

for (std::list<std::string>::reverse_iterator itList = testList.rbegin(); itList != testList.rend(); ++itList)
   testList.push_back(*itList);

for (std::list<std::string>::const_iterator itList = testList.begin(); itList != testList.end(); ++itList)
   std::cout << *itList << std::endl;

Результат не abccba, а abcccba. Правильно, добавлено одно дополнительное c.

Похоже, что первый push_back также изменяет значение итератора, который был инициализирован с помощью rbegin(). После push_back он указывает уже не на 3-й элемент в списке (который ранее был последним), а на 4-й элемент (который теперь является последним).

Я проверил это как с Visual Studio 2010, так и с GCC, и оба возвращают одинаковый результат.

Это ошибка? Или какое-то странное поведение обратных итераторов, о котором я не знаю?

19
задан Oliver Charlesworth 10 April 2012 в 08:53
поделиться