Я читал сообщение StackOverFlow относительно сортировки вектора пар вторым элементом пары. Самый очевидный ответ должен был создать предикат, но один ответ, который использовал повышение, привлек мое внимание.
std::sort(a.begin(), a.end(),
boost::bind(&std::pair::second, _1) <
boost::bind(&std::pair::second, _2));
Я пытался выяснить как повышение:: свяжите работы, или по крайней мере, как использовать его, но я не могу выяснить то, что цель аргументов заполнителя _1 и _2, и документация повышения не впитывается вообще.
Мог любой объяснять это определенное использование повышения:: связать?
P.S. Исходный вопрос: Как я сортирую вектор пар на основе второго элемента пары?
Это выражение:
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 сделает такие выражения устаревшими.
STD :: Сорт требует двоичного предиката для сравнения двух элементов из диапазона. Заполнители показывают, где будут использоваться первый и второй аргумент.
Boost :: Bind делает его таким образом, чтобы все выражение читалось как _1.second <_2.second
(за исключением случаев. Оператор не перегружается, такая выразительность не может быть достигнута).
Оба вызовы связывания в этом случае создают функциональный объект, который принимает пару
и возвращает значение второго
. Оператор <
, в свою очередь, перегружен для возврата другого двоичного функтора, который сравнивает результаты предыдущих функторов. И это используется STD :: Сортировка
.