Помогите понять boost :: bind placeholder аргументы - PullRequest
6 голосов
/ 23 января 2010

Я читал пост StackOverFlow о сортировке вектора пар по второму элементу пары. Наиболее очевидным ответом было создание предиката, но один ответ, который использовал повышение, попался на глаза.

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

Я пытался выяснить, как работает boost :: bind, или, по крайней мере, просто как его использовать, но я не могу понять, какова цель аргументов-заполнителей _1 и _2, и документацию по Boost не тонет вообще.

Может ли кто-нибудь объяснить это конкретное использование boost :: bind?

P.S. Оригинальный вопрос: Как отсортировать вектор пар на основе второго элемента пары?

Ответы [ 2 ]

7 голосов
/ 23 января 2010

Это выражение:

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

а именно, использование оператора < фактически определяет функтор между двумя другими функторами, каждый из которых определяется как bind.

Функтор, ожидаемый для сортировки, должен иметь operator(), который выглядит следующим образом:

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

когда вы создаете функтор, используя < boost, тогда имена владельцев _1 и _2 соответствуют arg1 и arg2 создаваемого функтора.

Вызов bind создает функтор, который вызывает ::second из arg1 и arg2

Если повезет, введение лямбда-выражений в C ++ 0x сделает такие выражения устаревшими.

5 голосов
/ 23 января 2010

std :: sort требует двоичного предиката для сравнения двух элементов из диапазона. Заполнители показывают, где будут использоваться первый и второй аргументы.

boost :: bind делает так, чтобы все выражение читалось как _1.second < _2.second (кроме случаев, когда оператор. Не перегружен, такая выразительность не может быть достигнута).

Оба вызова bind в этом случае создают объект функции, который принимает pair<int, int> и возвращает значение second. operator< в свою очередь перегружается, чтобы вернуть другой двоичный функтор, который сравнивает результаты предыдущих функторов. И это привыкнет к std::sort.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...