我正在阅读StackOverFlow帖子,关于通过该对的第二个元素对对矢量进行排序。最明显的答案是创建一个谓词,但是一个使用boost的答案引起了我的注意。
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。原始问题:How do I sort a vector of pairs based on the second element of the pair?
答案 0 :(得分:7)
这个表达式:
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);
当您使用提升<
创建仿函数时,名称持有者_1
和_2
对应于您的仿函数的arg1
和arg2
重新创造。
bind
来电创建了一个调用::second
arg1
和arg2
运气好的话,在C ++ 0x中引入lambdas会使这样的表达式过时。
答案 1 :(得分:5)
std :: sort需要二元谓词来比较范围中的两个项目。占位符显示将使用第一个和第二个参数的位置。
boost :: bind使得整个表达式读作_1.second < _2.second
(除非。运算符不可重载,因此无法实现这种表达)。
在这种情况下,两个绑定调用都会创建一个接受pair<int, int>
的函数对象,并返回second
的值。反过来operator<
重载以返回另一个二进制函数,它比较前面仿函数的结果。这被std::sort
使用。