Wie können wir in C ++ 11 mit lambda / for_each ein Array vom Ende her iterieren?
Ich habe Folgendes versucht, aber beide ergeben eine Endlosschleife:
%Vor%Irgendeine Idee? Vielen Dank.
std::for_each( A.rbegin(), A.rend(), [](int i) { /*code*/ } );
ist die einfache Lösung.
Ich habe stattdessen backwards
geschrieben, das eine Sequenz akzeptiert, extrahiert den% iterator begin
und end
mit den Funktionen begin
und end
(mit std::begin
und std::end
using
Deklarationen in der Nähe - vollständige ADL), erstellt um sie herum umgekehrte Iteratoren und gibt dann eine Sequenz mit diesen beiden umgekehrten Iteratoren zurück.
Es ist irgendwie ordentlich, weil Sie diese Syntax bekommen:
%Vor% was ich leichter zu lesen finde als std::for_each
oder manuelle for
Schleifen.
Aber ich bin ein bisschen verrückt.
Hier ist ein minimaler backwards
. Eine vollständige Lösung behandelt adl und ein paar Eckfälle besser.
Ein einfacher Bereich für nur für Bereich. Kann mit perfekter Weiterleitung ergänzt werden.
Übergeben von C
an den Container, der möglicherweise lebenslang erweitert werden muss. Wenn der Wert als rvalue übergeben wird, wird kopiert, andernfalls nur referenziert. Es wird sonst nicht verwendet.
Der nächste Teil ist einfach:
%Vor%Das ist nicht getestet, sollte aber funktionieren.
Ein wichtiger Test ist sicherzustellen, dass es funktioniert, wenn Sie einen rvalue vec wie:
füttern %Vor% funktioniert - das ist es, worum es bei der Unordnung von C
geht. Es wird außerdem davon ausgegangen, dass Iteratoren mit verschobenen Containern über Iteratoren verfügen, die sich gut verhalten.
Boost bietet eine Funktion namens umgekehrt , das mit C ++ 11 range based for loop verwendet werden kann, wie Yakk beschreibt in seiner Antwort:
%Vor%oder
%Vor%