Как вы можете использовать обратный итератор с итератором, который является прокси

Если у вас есть итератор, который фактически является прокси-сервером и содержит данные, которые он возвращает, как вы можете создать обратный итератор?

Реализация stre :: reverse_iterator оператора разыменования создает временный объект, который затем декрементируется и разыменовывается с кодом, который выглядит примерно так:

  reference operator*() const {
iterator tmp = current;
return *--tmp;
}

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

Это имеет довольно печальные результаты.

Как вы можете обойти это?

3

Решение

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

В соответствии с http://en.cppreference.com/w/cpp/iterator/reverse_iterator, некоторые реализации также хранят уменьшенную копию итератора, но не все. Boost :: reverse_iterator не отображает дополнительную копию.

1

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

Я думаю, что реализация стандартной библиотеки неверна. Если вы посмотрите на 24.5.1.3.4 [reverse.iter.op.star] в стандарте C ++ 11, вы найдете следующее:

deref_tmp = current;
--deref_tmp;
return *deref_tmp;

Примечание. Эта операция должна использовать вспомогательную переменную-член, а не временную переменную, чтобы избежать возврата ссылки, которая сохраняется в течение времени жизни ассоциированного итератора.

В стандарте deref_tmp является членом данных только для экспозиции reverse_iterator,

1

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