Как вы вставляете с reverse_iterator - PullRequest
23 голосов
/ 19 ноября 2008

Я хочу вставить что-то в список STL в C ++, но у меня есть только обратный итератор. Как обычно это сделать?

Это работает: (конечно, это так)

std::list<int> l;
std::list<int>::iterator forward = l.begin();
l.insert(forward, 5);

Это не работает: (что мне делать вместо этого?)

std::list<int> l;
std::list<int>::reverse_iterator reverse = l.rbegin();
l.insert(reverse, 10);

Ответы [ 2 ]

26 голосов
/ 19 ноября 2008

l.insert(reverse.base(), 10); вставит «10» в конце, учитывая ваше определение «обратного» итератора. На самом деле, l.rbegin().base() == l.end().

7 голосов
/ 19 ноября 2008

По сути, вы этого не делаете. См. 19.2.5 в TCPPPL.

Обратный_итератор имеет элемент base (), который возвращает «обычный» итератор. Таким образом, следующий код будет работать в вашем примере:

l.insert (reverse.base (), 10);

Будьте осторожны, потому что метод base () возвращает элемент один после того, как на него указал исходный reverse_iterator. (Это так, что reverse_iterators, указывающие на rbegin () и rend (), работают правильно.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...