如何在复合类型上使用 Boost.Bind?
我有 std::mapshort
。如何将 boost::bind
与 std::min_element()
结合使用?
boost::lambda
?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
我有 std::mapshort
。如何将 boost::bind
与 std::min_element()
结合使用?
boost::lambda
?
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(3)
map
迭代器将为您提供一个pair
,其中first
是int
键,second
> 是映射的pair
值,因此如果您有一个迭代器it
,您需要所有it->second.first值。
min_element
函数需要其第三个参数的比较函数,因此您需要构建一个比较函数来投影其两个参数的second.first
。我们将从一些 typedef 开始,以使代码更具可读性:
我们将使用 Boost.Lambda 作为其重载运算符,从而允许我们使用
operator<
。 Boost.Bind 可以绑定成员变量和成员函数,因此我们也将利用这一点。这也适用于
boost::lambda::bind
。The
map
iterator will give you apair
wherefirst
is theint
key andsecond
is the map'spair
value, so if you had an iteratorit
, you'd want the minimum of all theit->second.first
values. Themin_element
function expects a comparison function for its third argument, so you need to build a comparison function that projectssecond.first
of its two arguments.We'll start with some typedefs to make the code more readable:
We're going to use Boost.Lambda for its overloaded operators, allowing us to use
operator<
. Boost.Bind can bind member variables as well as member functions, so we'll take advantage of that, too.That will also work with
boost::lambda::bind
.(当然,有人会抱怨这是对 STL 的滥用,并且这些扩展不属于 C++ 标准……)
(Of course, somebody's going to complain that this is an abuse of STL and that these are extensions not in the C++ standard…)
bind
本身无法做到这一点,因为first
和second
作为字段公开,而不是方法(所以你不能逃脱像mem_fun
)。当然,您可以使用自己的函子来做到这一点:
bind
cannot do this by itself, becausefirst
andsecond
are exposed as fields, not methods (so you can't get away with something likemem_fun
).You could do this using your own functor of course though: