帮助理解boost :: bind占位符参数

时间:2010-01-22 21:38:44

标签: c++ boost

我正在阅读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?

2 个答案:

答案 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对应于您的仿函数的arg1arg2重新创造。

bind来电创建了一个调用::second arg1arg2

的仿函数

运气好的话,在C ++ 0x中引入lambdas会使这样的表达式过时。

答案 1 :(得分:5)

std :: sort需要二元谓词来比较范围中的两个项目。占位符显示将使用第一个和第二个参数的位置。

boost :: bind使得整个表达式读作_1.second < _2.second(除非。运算符不可重载,因此无法实现这种表达)。

在这种情况下,两个绑定调用都会创建一个接受pair<int, int>的函数对象,并返回second的值。反过来operator<重载以返回另一个二进制函数,它比较前面仿函数的结果。这被std::sort使用。