Existe um adaptador de contêiner que inverta a direção dos iteradores para que eu possa iterar sobre um contêiner invertido com loop for baseado em intervalo?
Com iteradores explícitos, eu converteria isso:
for (auto i = c.begin(); i != c.end(); ++i) { ...
nisso:
for (auto i = c.rbegin(); i != c.rend(); ++i) { ...
Eu quero converter isso:
for (auto& i: c) { ...
para isso:
for (auto& i: std::magic_reverse_adapter(c)) { ...
Existe uma coisa dessas ou eu mesmo tenho que escrever?
begin
para end
ou para lidar com iteradores de fluxo e afins. Os algoritmos de alcance seriam ótimos, mas são realmente apenas açúcar sintático (exceto a possibilidade de avaliação lenta) sobre algoritmos de iterador.
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; };
Ele pode ser melhorado (adicionando const
versões, etc.) mas funciona: vector<int> v {1, 2, 3}; reverse_adapter<decltype(v)> ra; for (auto& i : ra) cout << i;
impressões321
template<typename T> reverse_adapter<T> reverse_adapt_container(T &c) {return reverse_adapter<T>(c);}
Então você pode usar apenas for(auto &i: reverse_adapt_container(v)) cout << i;
para iterar.
parallel_for
seria para isso, com uma condição ainda mais forte de "não ligo para que ordem", se fosse incorporada ao padrão de alguma forma. Claro que poderia ter um açúcar sintático baseado em gama também :-)