Esiste un adattatore contenitore che potrebbe invertire la direzione degli iteratori in modo che io possa scorrere su un contenitore al contrario con for-loop basato su intervallo?
Con gli iteratori espliciti convertirei questo:
for (auto i = c.begin(); i != c.end(); ++i) { ...
in questo:
for (auto i = c.rbegin(); i != c.rend(); ++i) { ...
Voglio convertire questo:
for (auto& i: c) { ...
a questa:
for (auto& i: std::magic_reverse_adapter(c)) { ...
C'è una cosa del genere o devo scriverla da solo?
begina end, o per trattare con iteratori flusso e simili. Gli algoritmi di intervallo sarebbero fantastici, ma in realtà sono solo zucchero sintattico (tranne la possibilità di una valutazione pigra) rispetto agli algoritmi iteratori.
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; };Può essere migliorato (aggiungendo constversioni, ecc.) ma funziona: vector<int> v {1, 2, 3}; reverse_adapter<decltype(v)> ra; for (auto& i : ra) cout << i;stampe321
template<typename T> reverse_adapter<T> reverse_adapt_container(T &c) {return reverse_adapter<T>(c);}Quindi puoi semplicemente usarlo for(auto &i: reverse_adapt_container(v)) cout << i;per iterare.
parallel_forsarebbe, con una condizione "Non mi interessa quale ordine" ancora più forte, se fosse incorporato nello standard in qualche forma. Ovviamente potrebbe anche avere uno zucchero sintattico basato sulla gamma :-)