15

请看一下 Johannes Schaub 发布的这个示例,以对成对的向量进行排序:

如何根据对的第二个元素对对的向量进行排序?

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

我以为我确实理解 boost::bind,但我在这个方面遇到了麻烦。

问题一:

排序算法需要一个谓词函数作为第三个参数。我在这里看到的是一个布尔表达式。我错过了什么?:

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

boost::bind 库是否为这两个绑定重载 operator<,并返回某种函数指针(如 lambda)?

问题2:
这让我很困惑:

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

通常有某种函数指针作为绑定调用的第一个参数,但这里它是类成员的地址?该特定绑定的结果是什么?

感谢您的时间和帮助

4

2 回答 2

14

boost::bind 重载了操作符!以及关系和逻辑运算符 ==、!=、<、<=、>、>=、&&、||,所以这就是为什么你“看到”一个布尔表达式,但实际上你得到的是一个函数谓词。

从那里您可以看到您正在为重载的小于函数的第一个和第二个参数绑定该对的第二个成员。

至于您的第二个问题:Boost bind 将识别您何时将指针传递给成员并将其视为您调用

bind<R>(mem_fun(&std::pair<int,int>::second), args);

文档是这样描述的:

使用带有指向成员的指针的绑定

指向成员函数的指针和指向数据成员的指针不是函数对象,因为它们不支持 operator()。为方便起见,bind 接受成员指针作为其第一个参数,其行为就好像 boost::mem_fn 已用于将成员指针转换为函数对象。换句话说,表达式

绑定(&X::f,参数)

相当于

绑定(mem_fn(&X::f),参数)

其中 R 是 X::f 的返回类型(对于成员函数)或成员的类型(对于数据成员。)

您可以在此处找到此信息和更多信息。

于 2010-11-15T13:52:13.873 回答
2

您的理论是正确的,请参阅:

http://www.boost.org/doc/libs/1_44_0/libs/bind/bind.html#operators

于 2010-11-15T13:51:33.480 回答