¿Hay un adaptador de contenedor que invierta la dirección de los iteradores para que pueda iterar sobre un contenedor en reversa con un bucle for basado en rango?
Con iteradores explícitos convertiría esto:
for (auto i = c.begin(); i != c.end(); ++i) { ...
dentro de esto:
for (auto i = c.rbegin(); i != c.rend(); ++i) { ...
Quiero convertir esto:
for (auto& i: c) { ...
a esto:
for (auto& i: std::magic_reverse_adapter(c)) { ...
¿Existe tal cosa o tengo que escribirla yo mismo?
begin
hacia end
, o para tratar con iteradores de flujo y similares. Los algoritmos de rango serían geniales, pero en realidad son solo azúcar sintáctica (a excepción de la posibilidad de una evaluación diferida) sobre los algoritmos iteradores.
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; };
Se puede mejorar (agregar const
versiones, etc.) pero funciona: vector<int> v {1, 2, 3}; reverse_adapter<decltype(v)> ra; for (auto& i : ra) cout << i;
impresiones321
template<typename T> reverse_adapter<T> reverse_adapt_container(T &c) {return reverse_adapter<T>(c);}
entonces puedes usar for(auto &i: reverse_adapt_container(v)) cout << i;
para iterar.
parallel_for
sería, con una condición aún más fuerte de "No me importa qué orden", si se incorporara al estándar de alguna forma. Por supuesto, también podría tener un azúcar sintáctico basado en rango :-)