2010-11-15 11 views
15

Proszę spojrzeć na ten przykład wysłana przez Johannes Schaub posortować wektor par:Pomóż mi zrozumieć to wykorzystanie boost :: wiążą

How do I sort a vector of pairs based on the second element of the pair?

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

myślałem rozumiem impuls: : bind, ale mam problem z tym.

Pytanie 1:

algorytm sortowania spodziewa funkcję predykatu jako trzeci parametr. To, co tu widzę, jest wyrażeniem boolowskim. Co mi brakuje ?:

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

Czy wiążą biblioteki boost :: operator przeciążeniem < dla tych dwóch powiązań i wraca jakiegoś wskaźnika funkcji (jak lambda)?

Pytanie 2:
to dostaje mnie pomylić:

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

Zazwyczaj istnieje jakiś wskaźnik funkcji jako pierwszy parametr wywołania wiązania, ale tutaj jest to adres członka klasy? Jaki jest wynik tego konkretnego powiązania?

Dzięki za poświęcony czas & pomocy

Odpowiedz

14

boost :: wiążą przeciąża operator! i operatory relacyjne i logiczne ==,! =, <, < =,>,> =, & &, ||, więc właśnie dlatego "widzisz" wyrażenie boolowskie, ale tak naprawdę wracasz do funkcji predykatu .

Stamtąd widać, że wiążemy drugi element pary dla pierwszego i drugiego argumentu przeciążonego mniej niż funkcja.

Co do drugiego pytania: doładowania wiążą rozpozna kiedy zdałeś wskaźnik do członka i traktować go jako jeśli nazywa

bind<R>(mem_fun(&std::pair<int,int>::second), args); 

ten sposób dokumentacja opisuje następująco:

Korzystanie wiążą ze wskaźnikami członkom

wskaźniki do funkcji składowych i odnośniki do członków dane nie są obiektów funkcyjnych, ponieważ nie obsługują operatora (). Dla wygody powiązanie akceptuje wskaźniki członkowskie jako pierwszy argument , a zachowanie jest takie, jak , jeśli funkcja boost :: mem_fn została użyta do konwersji wskaźnika elementu na obiekt funkcji .Innymi słowy, ekspresji

powiązań (& X :: K, arg)

jest równoważne

bind (mem_fn (& X :: f) arg)

gdzie R jest typem zwrotnym X :: f (dla funkcji składowych) lub typem członu (dla elementów danych).

Możesz znaleźć ten i więcej informacji here.

Powiązane problemy