Есть ли контейнерный адаптер, который бы изменял направление итераторов, чтобы я мог перебирать контейнер в обратном направлении с помощью цикла for на основе диапазона?
С явными итераторами я бы преобразовал это:
for (auto i = c.begin(); i != c.end(); ++i) { ...
в это:
for (auto i = c.rbegin(); i != c.rend(); ++i) { ...
Я хочу преобразовать это:
for (auto& i: c) { ...
к этому:
for (auto& i: std::magic_reverse_adapter(c)) { ...
Есть ли такая вещь, или я должен написать это сам?
begin
по end
или для работы с потоковыми итераторами и т.п. Алгоритмы диапазона были бы хороши, но они действительно просто синтаксический сахар (за исключением возможности ленивой оценки) по сравнению с алгоритмами итератора.
template<typename T> class reverse_adapter { public: reverse_adapter(T& c) : c(c) { } typename T::reverse_iterator begin() { return c.rbegin(); } typename T::reverse_iterator end() { return c.rend(); } private: T& c; };
Это может быть улучшено (добавление const
версий и т. д.), но это работает: vector<int> v {1, 2, 3}; reverse_adapter<decltype(v)> ra; for (auto& i : ra) cout << i;
печатает321
template<typename T> reverse_adapter<T> reverse_adapt_container(T &c) {return reverse_adapter<T>(c);}
так что тогда вы можете просто использовать for(auto &i: reverse_adapt_container(v)) cout << i;
для итерации.
parallel_for
, с еще более сильным условием «мне все равно, какой порядок», если бы оно было включено в стандарт в той или иной форме. Конечно, он также может иметь синтаксический сахар на основе диапазона :-)