Возможный дубликат:
Почему push_back в std :: list меняет обратный итератор, инициализированный с помощью rbegin?
Я получил кусок кода следующим образом:
#include <iostream>
#include <list>
int main(){
std::list<int> l;
l.push_back(1);
l.push_back(2);
std::list<int>::iterator it = l.begin();
std::cout << *it << std::endl; // 1
l.push_front(0);
std::cout << *it << std::endl; // 1
std::list<int>::reverse_iterator rit = l.rbegin();
std::cout << *rit << std::endl; // 2
l.push_back(3);
std::cout << *rit << std::endl; // 3
}
выход:
1
1
2
3
Похоже, что после того, как я определю прямой итератор it
если я позвоню push_front()
, положение it
НЕ ИЗМЕНИТСЯ. Однако после того, как я определю reverse_iterator rit
если я позвоню push_back()
, положение rit
Изменится.
Должно ли это рассматриваться как несоответствие? Для меня не имеет никакого смысла, что один из них движется, а другой остается прежним.
Заранее спасибо. 🙂
std::list
не делает недействительными итераторы. Как вы видите с обычным итератором, итераторы на std::list
указывать на тот же элемент даже после изменения списка.
Обратные итераторы, с другой стороны, реализуются как std::reverse_iterator<iterator>
который согласно C ++ STL документация, поддерживать итератор, указывающий на элемент до тот, который возвращается итератором, который в этом случае является концом списка.
Других решений пока нет …