Ответ 1
Сделайте сравнение, используя итератор, возвращенный base()
: it == rit.base() - 1
.
Я работаю над упражнением, где у меня есть вектор, и я пишу свой собственный обратный алгоритм, используя обратный и нормальный (прямой) итератор, чтобы отменить содержимое вектора. Однако я не могу сравнивать итераторы.
int vals[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
vector<int> numbers(vals, vals + 10);
vector<int>::iterator start = numbers.begin();
vector<int>::reverse_iterator end = numbers.rend();
У меня есть предыдущий алгоритм для изменения вектора с помощью двух итераторов, однако в этой задаче я не могу их сравнивать, используя оператор!= между ними. Мое предположение заключалось бы в том, чтобы получить базовые указатели или индексы в векторе друг с другом, но как получить указатели/индекс?
Сделайте сравнение, используя итератор, возвращенный base()
: it == rit.base() - 1
.
Вы можете преобразовать reverse_iterator
в iterator
, вызвав base()
.
Будьте осторожны, так как есть некоторые оговорки. @Matthieu M. комментарий особенно полезен:
Примечание:
base()
возвращаетiterator
элемент, следующий за элемент, на который указывалreverse_iterator
.
Оформить заказ http://en.cppreference.com/w/cpp/iterator/reverse_iterator/base
rit.base()
возвращает "нормальный" итератор.
Вы можете использовать (&*start == &*(end - 1))
для прямого сравнения адреса, на который указывает итератор.
Эти два типа нельзя сравнивать (что является очень хорошей идеей), и, по моему мнению, вызов .base()
не очень элегантен (или универсален). Вы можете преобразовать типы и сравнить результат. Принимая во внимание правило off-by-one с участием reverse_iterators
.
Преобразование из iterator
в reverse_iterator
должно быть явным (к счастью), однако преобразование из reverse_iterator в итератор невозможно (к сожалению). Так что есть только один способ сделать преобразование, а затем сделать сравнение.
std::vector<double> vv = {1.,2.,3.};
auto it = vv.begin();
auto rit = vv.rend();
// assert( it == rit ); // error: does not compile
assert(std::vector<double>::reverse_iterator{it} == rit);