Это точно проблема, которая побудила начать разработку STL. Существуют реальные причины:
- Не хранить итераторы вместе с контейнерами
- Использование алгоритмов, принимающих произвольные итераторы
- Наличие алгоритмов для оценки всего диапазона вместо одного элемента за раз
Я подозреваю, что то, что вы видите сейчас, является более или менее вершиной айсберга реальных проблем. Мой совет - сделать шаг назад, и вместо того, чтобы спрашивать о том, как работать с деталями дизайна в его нынешнем виде, задайте несколько более общий вопрос о том, чего вы пытаетесь достичь, и как лучше всего это сделать. конечный результат.
Для тех, кому важен вопрос в названии, ответ - «да». В частности, reverse_iterator имеет элемент base()
для этого. Хотя квалификации несколько проблематичны.
Чтобы продемонстрировать проблему, рассмотрите код следующим образом:
#include <iostream>
#include <vector>
#include <iterator>
int main() {
int i[] = { 1, 2, 3, 4};
std::vector<int> numbers(i, i+4);
std::cout << *numbers.rbegin() << "\n";
std::cout << *numbers.rbegin().base() << "\n";
std::cout << *(numbers.rbegin()+1).base() << "\n";
std::cout << *numbers.rend() << "\n";
std::cout << *numbers.rend().base() << "\n";
std::cout << *(numbers.rend()+1).base() << "\n";
}
Выполнение этого в данный конкретный момент на моей конкретной машине дает следующий вывод:
4
0
4
-1879048016
1
-1879048016
Резюме: с rbegin()
мы должны добавить один перед преобразованием в прямой итератор, чтобы получить действительный итератор - но с rend()
мы должны не добавить один до преобразование для получения действительного итератора.
Пока вы используете X.rbegin()
и X.rend()
в качестве параметров универсального алгоритма, это нормально, но опыт показывает, что преобразование в прямые итераторы часто приводит к проблемам.
В конце, однако, для основной части вопроса (в отличие от заголовка) ответ в значительной степени такой же, как приведенный выше: проблема заключается в попытке создать объект, который объединяет коллекцию с парой итераторов в эту коллекцию. Исправьте эту проблему, и весь бизнес с прямыми и обратными итераторами станет спорным.