Czy istnieje adapter kontenera, który odwróciłby kierunek iteratorów, dzięki czemu mogę iterować po kontenerze w odwrotnej kolejności za pomocą pętli for opartej na zakresie?
Za pomocą jawnych iteratorów przekonwertowałbym to:
for (auto i = c.begin(); i != c.end(); ++i) { ...
zaangażowany w to:
for (auto i = c.rbegin(); i != c.rend(); ++i) { ...
Chcę przekonwertować to:
for (auto& i: c) { ...
do tego:
for (auto& i: std::magic_reverse_adapter(c)) { ...
Czy istnieje coś takiego, czy muszę to sam napisać?
begin
do end
, lub do czynienia z iteratorów strumienia i tym podobne. Algorytmy zakresu byłyby świetne, ale tak naprawdę to tylko cukier syntaktyczny (z wyjątkiem możliwości leniwej oceny) w stosunku do algorytmów iteracyjnych.
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; };
Można to ulepszyć (dodając const
wersje itp.), ale działa: vector<int> v {1, 2, 3}; reverse_adapter<decltype(v)> ra; for (auto& i : ra) cout << i;
wydruki321
template<typename T> reverse_adapter<T> reverse_adapt_container(T &c) {return reverse_adapter<T>(c);}
Więc możesz po prostu użyć for(auto &i: reverse_adapt_container(v)) cout << i;
iteracji.
parallel_for
byłby cel, z jeszcze silniejszym warunkiem „nie dbam o to, jaki porządek”, gdyby został włączony do normy w jakiejś formie. Oczywiście może mieć również cukier syntaktyczny oparty na zakresie :-)