In C ++, wie Array in umgekehrter Reihenfolge mit for_each zu iterieren?

7

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.

    
user350954 01.09.2013, 20:07
quelle

3 Antworten

18

Sie haben das verpasst?

Wende dein rbegin & amp; rend

%Vor%

Durch Erhöhen des umgekehrten Iterators werden sie an den Anfang des Containers verschoben

    
P0W 01.09.2013, 20:08
quelle
5

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.

%Vor%

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.

    
Yakk 03.09.2013 03:57
quelle
0

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%     
Vizor 09.12.2015 21:50
quelle

Tags und Links