Сравнить вектор <T>:: итератор с вектором <T>:: reverse_iterator - программирование
Подтвердить что ты не робот

Сравнить вектор <T>:: итератор с вектором <T>:: reverse_iterator

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

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();

У меня есть предыдущий алгоритм для изменения вектора с помощью двух итераторов, однако в этой задаче я не могу их сравнивать, используя оператор!= между ними. Мое предположение заключалось бы в том, чтобы получить базовые указатели или индексы в векторе друг с другом, но как получить указатели/индекс?

4b9b3361

Ответ 1

Сделайте сравнение, используя итератор, возвращенный base(): it == rit.base() - 1.

Ответ 2

Вы можете преобразовать reverse_iterator в iterator, вызвав base().

Будьте осторожны, так как есть некоторые оговорки. @Matthieu M. комментарий особенно полезен:

Примечание: base() возвращает iterator элемент, следующий за элемент, на который указывал reverse_iterator.

Ответ 4

Вы можете использовать (&*start == &*(end - 1)) для прямого сравнения адреса, на который указывает итератор.

Ответ 5

Эти два типа нельзя сравнивать (что является очень хорошей идеей), и, по моему мнению, вызов .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);