我正在阅读StackOverFlow帖子,关于通过该对的第二个元素对对矢量进行排序.最明显的答案是创建一个谓词,但是一个使用boost的答案引起了我的注意.
std::sort(a.begin(), a.end(),
boost::bind(&std::pair<int, int>::second, _1) <
boost::bind(&std::pair<int, int>::second, _2));
Run Code Online (Sandbox Code Playgroud)
我一直试图弄清楚boost :: bind是如何工作的,或者至少是如何使用它,但是我无法弄清楚占位符参数_1和_2的用途是什么,而且boost文档没有陷入困境.
谁能解释一下boost :: bind的具体用法?
PS原始问题:如何根据对的第二个元素对对矢量进行排序?
这个表达式:
boost::bind(&std::pair<int, int>::second, _1) <
boost::bind(&std::pair<int, int>::second, _2)
Run Code Online (Sandbox Code Playgroud)
也就是说,<操作符的使用实际上在两个其他仿函数之间定义了一个仿函数,两个仿函数都由其定义bind.
排序期望的仿函数需要具有operator()如下所示的:
bool operator()(const T& arg1, const T& arg2);
Run Code Online (Sandbox Code Playgroud)
当你使用升压转换器的创建仿函数<,则持有人的名称_1和_2对应于arg1和arg2正在创建的仿函数.
该bind调用创建一个调用函子::second的arg1和arg2
运气好的话,在C++ 0x中引入lambdas会使这样的表达式过时.
std :: sort需要二元谓词来比较范围中的两个项.占位符显示将使用第一个和第二个参数的位置.
boost :: bind使得整个表达式读取为_1.second < _2.second(除非.操作符不可重载,因此无法实现这种表达).
在这种情况下,两个绑定调用都会创建一个接受a pair<int, int>并返回值的函数对象second.operator<反过来重载以返回另一个二元仿函数,它比较前面仿函数的结果.这被用来了std::sort.
| 归档时间: |
|
| 查看次数: |
5285 次 |
| 最近记录: |