Я хочу перебрать некоторые 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.
Я не думаю, что это обман. Связанный вопрос касается преобразования из обратного итератора в итератор, этот вопрос - о единообразном способе обхода контейнера.
@ Свен, ладно, круто. Так что вы имеете в виду, говоря, что не использует один и тот же родительский класс? Какая ошибка заставляет вас так говорить?
Как было предложено / задумано в вопросе, я бы использовал лямбда-шаблон, например [](auto it, auto end_it) { for(; it != end_it; ++it) cout << *it << ", ";.
@CodeMonkey Я немного отредактировал свой вопрос. Я переключился на repl.it как небольшую тестовую среду, и теперь я вижу, что VC и gcc имеют разные ошибки, но оба из-за несовместимых типов.





Не уверен, что лучше, и вы примете решение без 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). Я хочу разойтись в разных направлениях.
См. stackoverflow.com/questions/2037867/…