Gibt es einen Containeradapter, der die Richtung der Iteratoren umkehrt, damit ich mit einer bereichsbasierten for-Schleife in umgekehrter Reihenfolge über einen Container iterieren kann?
Mit expliziten Iteratoren würde ich Folgendes konvertieren:
for (auto i = c.begin(); i != c.end(); ++i) { ...
das sehr gut finden:
for (auto i = c.rbegin(); i != c.rend(); ++i) { ...
Ich möchte dies konvertieren:
for (auto& i: c) { ...
dazu:
for (auto& i: std::magic_reverse_adapter(c)) { ...
Gibt es so etwas oder muss ich es selbst schreiben?
begin
bis iterieren end
, oder für den Umgang mit Stream-Iteratoren und dergleichen. Bereichsalgorithmen wären großartig, aber sie sind wirklich nur syntaktischer Zucker (mit Ausnahme der Möglichkeit einer verzögerten Bewertung) gegenüber Iteratoralgorithmen.
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; };
Es kann verbessert werden (Hinzufügen von const
Versionen usw.), aber es funktioniert: vector<int> v {1, 2, 3}; reverse_adapter<decltype(v)> ra; for (auto& i : ra) cout << i;
Drucke321
template<typename T> reverse_adapter<T> reverse_adapt_container(T &c) {return reverse_adapter<T>(c);}
Dann können Sie einfach for(auto &i: reverse_adapt_container(v)) cout << i;
zum Iterieren verwenden.
parallel_for
genau das, wofür es wäre, mit einer noch stärkeren Bedingung "Es ist mir egal, welche Reihenfolge", wenn es in irgendeiner Form in den Standard aufgenommen würde. Natürlich könnte es auch einen Range-basierten syntaktischen Zucker geben :-)