如何在复合类型上使用 Boost.Bind?

发布于 2024-10-14 08:45:49 字数 205 浏览 7 评论 0 原文

我有 std::map; >,我需要在这张地图中找到最小的short。如何将 boost::bindstd::min_element() 结合使用?

boost::lambda

I have std::map<int, std::pair<short, float> >, and I need to find the minimal short in this map. How can I use boost::bind with std::min_element() for this?

boost::lambda?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

铜锣湾横着走 2024-10-21 08:45:49

map 迭代器将为您提供一个 pair,其中 firstint 键,second > 是映射的 pair 值,因此如果您有一个迭代器 it,您需要所有 it->second.first值。 min_element 函数需要其第三个参数的比较函数,因此您需要构建一个比较函数来投影其两个参数的 second.first

我们将从一些 typedef 开始,以使代码更具可读性:

typedef std::pair<short, float> val_type;
typedef std::map<int, val_type> map_type;
map_type m;

我们将使用 Boost.Lambda 作为其重载运算符,从而允许我们使用 operator<。 Boost.Bind 可以绑定成员变量和成员函数,因此我们也将利用这一点。

#include <boost/bind.hpp>
#include <boost/lambda/lambda.hpp>
using boost::bind;

// Comparison is (_1.second.first < _2.second.first)
std::cout <<
  std::min_element(m.begin(), m.end(),
    bind(&val_type::first, bind(&map_type::iterator::value_type::second, _1))
    <
    bind(&val_type::first, bind(&map_type::iterator::value_type::second, _2))
  )->second.first;

这也适用于 boost::lambda::bind

The map iterator will give you a pair where first is the int key and second is the map's pair value, so if you had an iterator it, you'd want the minimum of all the it->second.first values. The min_element function expects a comparison function for its third argument, so you need to build a comparison function that projects second.first of its two arguments.

We'll start with some typedefs to make the code more readable:

typedef std::pair<short, float> val_type;
typedef std::map<int, val_type> map_type;
map_type m;

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.

#include <boost/bind.hpp>
#include <boost/lambda/lambda.hpp>
using boost::bind;

// Comparison is (_1.second.first < _2.second.first)
std::cout <<
  std::min_element(m.begin(), m.end(),
    bind(&val_type::first, bind(&map_type::iterator::value_type::second, _1))
    <
    bind(&val_type::first, bind(&map_type::iterator::value_type::second, _2))
  )->second.first;

That will also work with boost::lambda::bind.

情归归情 2024-10-21 08:45:49
min_element(map.begin(), map.end(),
            compose2(less<short>(),
                     compose1(select1st<pair<short, float> >(),
                              select2nd<map<int, pair<short, float>
                                           >::value_type>()),
                     compose1(select1st<pair<short, float> >(),
                              select2nd<map<int, pair<short, float>
                                           >::value_type>()))
           ).second.first;

(当然,有人会抱怨这是对 STL 的滥用,并且这些扩展不属于 C++ 标准……)

min_element(map.begin(), map.end(),
            compose2(less<short>(),
                     compose1(select1st<pair<short, float> >(),
                              select2nd<map<int, pair<short, float>
                                           >::value_type>()),
                     compose1(select1st<pair<short, float> >(),
                              select2nd<map<int, pair<short, float>
                                           >::value_type>()))
           ).second.first;

(Of course, somebody's going to complain that this is an abuse of STL and that these are extensions not in the C++ standard…)

箹锭⒈辈孓 2024-10-21 08:45:49

bind 本身无法做到这一点,因为 firstsecond 作为字段公开,而不是方法(所以你不能逃脱像mem_fun)。

当然,您可以使用自己的函子来做到这一点:

template <typename F, typename S>
struct select_first : std::binary_function<std::pair<F, S>&, F&>
{
    F& operator()(std::pair<F, S>& toConvert)
    {
        return toConvert.first;
    }
};

bind cannot do this by itself, because first and second are exposed as fields, not methods (so you can't get away with something like mem_fun).

You could do this using your own functor of course though:

template <typename F, typename S>
struct select_first : std::binary_function<std::pair<F, S>&, F&>
{
    F& operator()(std::pair<F, S>& toConvert)
    {
        return toConvert.first;
    }
};
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文