Warum kann ich einen Vektor von reference_wrapperstd :: chrono :: Millisekunden nicht sortieren?

8

Ich möchte eine sortierte Ansicht von std::vector<std::chrono::milliseconds> , aber ich möchte den ursprünglichen Container nicht ändern. std::reference_wrapper scheint dafür perfekt und es funktioniert gut für einen Vektor von ganzen Zahlen.

Ich habe dieses kleine Beispiel erstellt:

%Vor%

Was die erwartete Ausgabe erzeugt (außer dass sorted_durations natürlich nicht sortiert ist, da dies auskommentiert ist):

%Vor%

Wie Sie sehen, ist der ursprüngliche Vektor von Ganzzahlen numbers durch die Sortieroperation von sorted_numbers unverändert - genau das möchte ich auch für den sorted_durations Vektor. Aber wenn ich diese Zeile auszeichne, wird mein Compiler sehr böse mit mir und ich muss zugeben, dass ich nicht herausfinden kann, was es mir zu sagen versucht. Mein Compiler ist clang ++ Version 3.8 und ich baue das Beispielprogramm so:

%Vor%

Und hier ist die Fehlerausgabe, die ich bekomme:

%Vor%

Es geht tatsächlich etwas länger, aber stackoverflow lässt mich nicht alle 55000 Zeichen des Fehlers posten.

Kann mir bitte jemand erklären, was ich falsch mache oder warum das einfach nicht möglich ist (wenn das der Fall ist)?

    
Jesper Juhl 01.04.2016, 12:18
quelle

2 Antworten

14

Der erste Fehler scheint ziemlich klar zu sein:

%Vor%

Sie können < nicht verwenden, um zwei reference_wrapper<duration<...>> -Objekte zu vergleichen.

Die Konvertierung in duration<...> erfolgt nicht, weil (wie oben erwähnt) operator< für duration eine Funktionsvorlage ist und ihre Argumente nicht aus reference_wrapper<duration<...>> abgeleitet werden können.

Wenn Sie eine Instanz von std::less<std::chrono::milliseconds> an std::sort übergeben haben, würde dies dazu führen, dass die Wrapper in die Durationstypen konvertiert und korrekt verglichen werden.

%Vor%

Dies bedeutet grundsätzlich, dass Sie die Objekte sortieren möchten, indem Sie sie als milliseconds nicht reference_wrapper<milliseconds> vergleichen.

    
Jonathan Wakely 01.04.2016, 12:39
quelle
4

Per @ Nialls Vorschlag, dass Sie lambda als Vergleich für sort() verwenden können:

%Vor%     
Brian Cain 01.04.2016 12:44
quelle

Tags und Links