Повышение понимания справки:: свяжите аргументы заполнителя

Я читал сообщение StackOverFlow относительно сортировки вектора пар вторым элементом пары. Самый очевидный ответ должен был создать предикат, но один ответ, который использовал повышение, привлек мое внимание.

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

Я пытался выяснить как повышение:: свяжите работы, или по крайней мере, как использовать его, но я не могу выяснить то, что цель аргументов заполнителя _1 и _2, и документация повышения не впитывается вообще.

Мог любой объяснять это определенное использование повышения:: связать?

P.S. Исходный вопрос: Как я сортирую вектор пар на основе второго элемента пары?

6
задан Community 23 May 2017 в 10:27
поделиться

2 ответа

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

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

а именно, использование оператора < на самом деле определяет functor между двумя другими functor, оба из которых определены с помощью bind.

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

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

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

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

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

7
ответ дан 9 December 2019 в 20:43
поделиться

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

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

Оба вызовы связывания в этом случае создают функциональный объект, который принимает пару и возвращает значение второго . Оператор <, в свою очередь, перегружен для возврата другого двоичного функтора, который сравнивает результаты предыдущих функторов. И это используется STD :: Сортировка .

5
ответ дан 9 December 2019 в 20:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: