Одна переменная для итератора или reverse_iterator?

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

#include <iostream>
#include <vector>
using namespace std;

int main() {
    vector<int> vec{0, 1, 2, 3, 5, 6, 7};
    bool reverse = true;
    std::iterator<random_access_iterator_tag, int> it, end_it;

    if (reverse) {
      it = vec.rbegin();
      end_it = vec.rend();
    } else {
      it = vec.begin();
      end_it = vec.end();
    }

    for (; it != end_it; it++) {
        cout << *it << ", ";
    }
    return 0;
}

Но, к сожалению, vector::begin() и vector::rbegin(), похоже, не используют один и тот же родительский класс. Есть ли другой способ сделать то, что я хочу, без двух разных циклов в структуре if-else? Конечно, я мог бы создать функцию / лямбду для тела цикла или использовать некоторую арифметику индекса, но есть ли более элегантный способ?

Компилятор жалуется на присвоение it = vec.begin(), поскольку они бывают разных типов. gcc и VC++ выводят разные ошибки и, похоже, используют разные типы для возвращаемых значений vector::begin.

См. stackoverflow.com/questions/2037867/…

Captain Giraffe 26.07.2018 20:11

Я не думаю, что это обман. Связанный вопрос касается преобразования из обратного итератора в итератор, этот вопрос - о единообразном способе обхода контейнера.

Edgar Rokjān 26.07.2018 20:17

@ Свен, ладно, круто. Так что вы имеете в виду, говоря, что не использует один и тот же родительский класс? Какая ошибка заставляет вас так говорить?

CodeMonkey 26.07.2018 20:55

Как было предложено / задумано в вопросе, я бы использовал лямбда-шаблон, например [](auto it, auto end_it) { for(; it != end_it; ++it) cout << *it << ", ";.

Eljay 26.07.2018 20:59

@CodeMonkey Я немного отредактировал свой вопрос. Я переключился на repl.it как небольшую тестовую среду, и теперь я вижу, что VC и gcc имеют разные ошибки, но оба из-за несовместимых типов.

Sven Hoek 26.07.2018 21:24
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
11
5
899
1

Ответы 1

Не уверен, что лучше, и вы примете решение без std :: iterator, но я считаю это немного более элегантным:

#include <iostream>
#include <vector>

using namespace std;

int main() {
vector<int> vec{0, 1, 2, 3, 4, 5, 6};
bool reverse = true;

for(int i: vec){
    if (reverse) 
        cout << vec[vec.size()-i] << endl;
    else 
        cout << vec[i] << endl;
  }
}

Не очень эффективно, так как вам нужно проверять, есть ли в каждом цикле.

Это не то, что я пытаюсь сделать. Числа в векторах являются просто примером и не должны использоваться в качестве индекса (кстати, у меня нет числа 4). Я хочу разойтись в разных направлениях.

Sven Hoek 26.07.2018 20:55

Другие вопросы по теме