stdlist — итератор списка C ++ reverse_iterator

Возможный дубликат:
Почему 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 Изменится.

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

Заранее спасибо. 🙂

2

Решение

std::list не делает недействительными итераторы. Как вы видите с обычным итератором, итераторы на std::list указывать на тот же элемент даже после изменения списка.

Обратные итераторы, с другой стороны, реализуются как std::reverse_iterator<iterator>который согласно C ++ STL документация, поддерживать итератор, указывающий на элемент до тот, который возвращается итератором, который в этом случае является концом списка.

-1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]