Existe-t-il un adaptateur de conteneur qui inverserait la direction des itérateurs afin que je puisse itérer sur un conteneur en sens inverse avec une boucle basée sur une plage?
Avec des itérateurs explicites, je convertirais ceci:
for (auto i = c.begin(); i != c.end(); ++i) { ...
en cela:
for (auto i = c.rbegin(); i != c.rend(); ++i) { ...
Je veux convertir ceci:
for (auto& i: c) { ...
pour ça:
for (auto& i: std::magic_reverse_adapter(c)) { ...
Existe-t-il une telle chose ou dois-je l'écrire moi-même?
begin
à end
ou pour traiter les itérateurs de flux et similaires. Les algorithmes de plage seraient formidables, mais ils ne sont vraiment que du sucre syntaxique (à l'exception de la possibilité d'une évaluation paresseuse) sur les algorithmes d'itérateur.
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; };
Il peut être amélioré (ajout de const
versions, etc.) mais cela fonctionne: vector<int> v {1, 2, 3}; reverse_adapter<decltype(v)> ra; for (auto& i : ra) cout << i;
impressions321
template<typename T> reverse_adapter<T> reverse_adapt_container(T &c) {return reverse_adapter<T>(c);}
Donc, vous pouvez simplement utiliser for(auto &i: reverse_adapt_container(v)) cout << i;
pour itérer.
parallel_for
servirait, avec une condition encore plus stricte «Je me fiche de l'ordre», si elle était incorporée dans la norme sous une forme ou une autre. Bien sûr, il pourrait aussi avoir un sucre syntaxique basé sur la plage :-)