Verwendung von std :: sort mit Paaren und Referenzen

8

Gibt es eine Möglichkeit, mit Sammlungen von Paaren, bei denen ein Element eine Referenz ist, zu arbeiten? Ich habe Code, wo ich ein std::vector<Ty> sortieren möchte, wobei Ty ist std::pair<A, B&> und A und B sind Klassen. Um ein konkretes Beispiel zu geben, hier ist Code für typedef std::pair<int, int&> Ty . Dies soll den Vektor nach dem zweiten Element des Paares sortieren.

%Vor%

Dies gibt aus:

%Vor%

Wenn ich jedoch den Verweis auf einen Zeiger ändere, funktioniert es wie erwartet

%Vor%

Ausgabe:

%Vor%

Ich würde es vorziehen, wenn möglich Referenzen zu verwenden; Gibt es eine Möglichkeit, das zu beheben? Ich habe versucht, mit dem Debugger durchzulaufen und ich kann nicht sehen, warum die Paare durch den Sortieralgorithmus nicht korrekt kopiert werden (vielleicht vertauscht?).

    
Peter Hull 24.05.2017, 08:40
quelle

2 Antworten

5

Wenn Sie einen std :: reference_wrapper verwenden, funktioniert es wie erwartet. Verfügbar Online .

%Vor%     
Jonas 24.05.2017, 08:50
quelle
1

Es scheint, dass libstdc++ swap nicht verwendet, obwohl die Verfügbarkeit erforderlich ist. Jedenfalls scheint dies legal zu sein. Wahrscheinlich macht es so etwas:

%Vor%

Die erste Zeile beinhaltet die Referenzinitialisierung. tmp.second verweist auf den gleichen Speicherort wie a.second . Daher behält b.second am Ende seinen ursprünglichen Wert und nicht den vorherigen Wert von a.second .

Zum Vergleich: Der unbenutzte Paar-Tausch hat mehr vernünftiges Verhalten:

%Vor%

Beachten Sie, dass selbst wenn std::sort std::pair<int, int&>::swap verwendet, die Semantik sich von der Zeigerversion unterscheidet, da die Zeigerversion die Zeiger selbst und nicht das externe Array sortiert.

    
Arne Vogel 24.05.2017 19:39
quelle

Tags und Links