2010-01-22 17 views
6

Czytałem stanowisko StackOverFlow dotyczące sortowania wektora par przez drugi element pary. Najbardziej oczywistą odpowiedzią było stworzenie predykatu, ale jedna odpowiedź, która posłużyła impulsowi, wpadła mi w oko.Pomoc w zrozumieniu argumentów zastępczych :: :: bind wiążących

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

Próbowałem dowiedzieć się, jak zwiększyć :: prace powiązań, a przynajmniej tak, jak go używać, ale nie mogę dowiedzieć się, jaki jest cel argumentów zastępczych i _1 _2 są a dokumentacja doładowania w ogóle nie zapada w pamięć.

Czy ktoś mógłby wyjaśnić to szczególne użycie boost :: bind?

P.S. Oryginalne pytanie: How do I sort a vector of pairs based on the second element of the pair?

Odpowiedz

7

Wyrażenie:

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

mianowicie zastosowanie operatora < definiowany przez funktor pomiędzy dwoma innymi funktorów, oba zdefiniowane przez bind.

funktor oczekiwaniami rodzaju musi mieć operator() który wygląda tak:

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

podczas tworzenia funktora użyciu < wtedy posiadaczy nazw doładowania za _1 i _2 odpowiadają arg1 i arg2 z funktor, który tworzysz.

bind wezwanie stworzyć funktor, który wywołuje ::second z arg1 i arg2

Przy odrobinie szczęścia, wprowadzenie lambda w C++ 0x pozwoli wyrażenia jak to przestarzała.

+0

Dla zapisu: 'typedef std :: pair pair_type; std :: sort (a.begin(), a.end(), [] (pair_type x, pair_type y) {return x.second GManNickG

5

std :: sort wymaga predykatu binarnego do porównania dwóch pozycji z zakresu. Symbole zastępcze wskazują miejsce pierwszego i drugiego argumentu.

Funkcja boost :: bind powoduje, że całe wyrażenie brzmi: _1.second < _2.second (poza tym, że operator "." Nie jest przeciążalny, nie można uzyskać takiej ekspresywności).

Obie wywołania bindowania, w tym przypadku, tworzą obiekt funkcji, który akceptuje numer pair<int, int> i zwraca wartość second. operator< z kolei jest przeciążony, aby zwrócić inny funktor binarny, który porównuje wyniki poprzednich funktorów. I to zostanie użyte przez std::sort.

Powiązane problemy