Wenn ich einen Paarvektor habe:
std::vector<std::pair<int, int> > vec;
Gibt es eine einfache Möglichkeit, die Liste in aufsteigender Reihenfolge nach dem zweiten Element des Paares zu sortieren?
Ich weiß, dass ich ein kleines Funktionsobjekt schreiben kann, das die Arbeit erledigt, aber gibt es eine Möglichkeit, vorhandene Teile der STL zu verwenden und std::less
die Arbeit direkt zu erledigen?
EDIT: Ich verstehe, dass ich eine separate Funktion oder Klasse schreiben kann, um sie zum Sortieren an das dritte Argument zu übergeben. Die Frage ist, ob ich es aus Standardmaterial bauen kann oder nicht. Ich hätte wirklich etwas, das aussieht wie:
std::sort(vec.begin(), vec.end(), std::something_magic<int, int, std::less>());
Antworten:
BEARBEITEN : Mit c ++ 14 ist die beste Lösung dank Lambdas, die jetzt Parameter vom Typ haben können, sehr einfach zu schreiben
auto
. Dies ist meine derzeitige LieblingslösungVerwenden Sie einfach einen benutzerdefinierten Komparator (dies ist ein optionales drittes Argument für
std::sort
)Wenn Sie einen C ++ 11-Compiler verwenden, können Sie dasselbe mit Lambdas schreiben:
BEARBEITEN : Als Antwort auf Ihre Änderungen an Ihrer Frage sind hier einige Gedanken ... Wenn Sie wirklich kreativ sein und dieses Konzept häufig wiederverwenden möchten, erstellen Sie einfach eine Vorlage:
dann kannst du das auch machen:
oder auch
Um ehrlich zu sein, ist das alles ein bisschen übertrieben. Schreiben Sie einfach die 3-Zeilen-Funktion und fertig :-P
quelle
operator<
inpair<T1,T2>
. Der Standardkomparator verwendet sowohl das erste als auch das zweite Element (falls die ersten gleich sind). Hier wird nur der zweite verwendet."is there and easy way to sort the list in increasing order based on the second element of the pair?"
Sie können Boost wie folgt verwenden:
Ich kenne keinen Standardweg, um dies ebenso kurz und prägnant zu machen, aber Sie können sich vorstellen,
boost::bind
dass alles aus Überschriften besteht.quelle
Es ist ziemlich einfach, wenn Sie die Sortierfunktion des Algorithmus verwenden und Ihre eigene Vergleichsfunktion hinzufügen
Jetzt müssen Sie den Vergleich anhand der zweiten Auswahl durchführen und deklarieren Sie "myComparison" als
quelle
Mit C ++ 0x können wir Lambda-Funktionen verwenden:
In diesem Beispiel der Rückgabetyp
bool
implizit abgeleitet.Lambda-Rückgabetypen
Wenn eine Lambda-Funktion eine einzelne Anweisung hat und dies eine return-Anweisung ist, kann der Compiler den Rückgabetyp ableiten. Ab C ++ 11, §5.1.2 / 4:
Um den Rückgabetyp explizit anzugeben, verwenden Sie das folgende Formular
[]() -> Type { }
:quelle
if (lhs.second == 0)
?lhs.second < rhs.second
kann zurückkehrentrue
oderfalse
und der Compiler kann eindeutig ableitenbool
. Ich wollte nur den[]() -> Type { }
Fall demonstrieren .Für etwas wiederverwendbares:
Sie können es als verwenden
oder
quelle
Sie müssten sich auf ein nicht standardmäßiges select2nd verlassen
quelle
Versuchen Sie, die Elemente der Paare auszutauschen, damit Sie sie
std::sort()
wie gewohnt verwenden können.quelle