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?
begin
a 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 const
versioni, 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_for
sarebbe, 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 :-)