C ++ reverse_iterator Альтернативы - PullRequest
3 голосов
/ 20 ноября 2010

Я пытаюсь написать двухпроходный алгоритм, включающий некоторый устаревший код.Я хочу пройти через определенный контейнер дважды, один раз в порядке и один раз в обратном порядке.Очевидно, что моей первой мыслью было использование iterator и reverse_iterator, но странным образом разработчики класса контейнера, который я использую, не сочли нужным определить рабочий reverse_iterator для контейнера (reverse_iterators здесь не можетбыть разыменованным, как iterators может быть).У меня уже есть алгоритм, который требует reverse_iterator.

. Моя мысль состоит в том, чтобы использовать итератор первого прохода для первой части алгоритма, и при выполнении алгоритма push_front элементы в новый контейнер, затем переберите новый контейнер.Это займет память, которая не критична для моего приложения, но заставила меня задуматься: есть ли более чистые альтернативы reverse_iterators в C ++ или мне нужно время, чтобы переработать мой алгоритм, используя только forward iterators?

1 Ответ

4 голосов
/ 20 ноября 2010

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

Если контейнер имеет двунаправленные итераторы, то вы можете использовать обычные итераторы и использовать --it для итерации от end() до begin() вместо использования ++it для итерации от begin() до end(),

Поскольку это немного сложно, вы можете использовать оболочку std::reverse_iterator для преобразования обычного итератора в обратный итератор (в основном это заменяет ++ и -- и инкапсулирует хитрость, необходимую для получения этогоwork).

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

Любой контейнер, имеющий двунаправленные итераторы, он должен обеспечивать функциональность обратного итератора;это является частью концепции «Контейнер» стандартной библиотеки STL и C ++.

...