2010-01-22 12 views
6

Ich war ein StackOverFlow Post lesen in Bezug auf die Sortierung eines Vektors von Paaren durch das zweite Element des Paares. Die offensichtlichste Antwort war, ein Prädikat zu erstellen, aber eine Antwort, die Boost nutzte, fiel mir auf.Hilfe zu verstehen Boost :: Bind Platzhalter Argumente

std::sort(a.begin(), a.end(), 
    boost::bind(&std::pair<int, int>::second, _1) < 
    boost::bind(&std::pair<int, int>::second, _2)); 

Ich habe versucht, herauszufinden, wie boost :: bind funktioniert, oder zumindest, wie es zu benutzen, aber ich kann der Zweck des Platzhalter Arguments _1 und _2 nicht herausfinden, was ist, und die Boost-Dokumentation versinkt überhaupt nicht.

Kann jemand diese spezielle Verwendung von boost :: bind erklären?

P.S. Ursprüngliche Frage: How do I sort a vector of pairs based on the second element of the pair?

Antwort

7

Dieser Ausdruck:

boost::bind(&std::pair<int, int>::second, _1) < 
boost::bind(&std::pair<int, int>::second, _2) 

nämlich die Nutzung des < Operator definiert tatsächlich einen Funktors zwischen zwei anderen functors, die beide durch bind definiert.

Der Funktor von Art zu erwarten braucht eine operator() zu haben, die wie folgt aussieht:

bool operator()(const T& arg1, const T& arg2); 

, wenn Sie Auftrieb der Erstellung sind ein Funktor mit < dann den Namen Halter _1 und _2 entsprechen arg1 und arg2 der Funktor, den du erschaffst.

Der bind Aufruf einen Funktor erstellen, die ::second von arg1 und arg2

Mit etwas Glück wird die Einführung von Lambda-Ausdrücke in C++ 0x nennt Ausdrücke wie diese obsolet machen.

+0

Für den Datensatz: 'typedef std :: pair pair_type; std :: sort (a.begin(), a.end(), [] (Paartyp x, Paartyp y) {return x.second GManNickG

5

std :: sort benötigt ein binäres Prädikat, um zwei Elemente aus dem Bereich zu vergleichen. Die Platzhalter zeigen an, wo das erste und das zweite Argument verwendet werden.

boost :: bind macht es so, dass der gesamte Ausdruck als _1.second < _2.second liest (außer da der Operator nicht überladbar ist, eine solche Aussagekraft nicht erreicht werden kann).

Beide Bindungsaufrufe erstellen in diesem Fall ein Funktionsobjekt, das eine pair<int, int> akzeptiert und den Wert second zurückgibt. operator< wird wiederum überladen, um einen anderen binären Funktor zurückzugeben, der die Ergebnisse der vorherigen Funktoren vergleicht. Und das wird von std::sort verwendet.

Verwandte Themen