8

私は を持っており、このマップstd::map<int, std::pair<short, float> >で最小のものを見つける必要があります。shortこれにどのように使用できboost::bindますstd::min_element()か?

boost::lambda?

4

3 に答える 3

6

mapiterator は、wherepairfirstキーintsecondあり、 がマップのpair値であることを示すため、 iterator がある場合はit、すべてのit->second.first値の最小値が必要になります。このmin_element関数は 3 番目の引数に比較関数を想定しているためsecond.first、2 つの引数を射影する比較関数を作成する必要があります。

コードを読みやすくするために、いくつかの 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ます。

于 2011-01-25T16:37:48.487 に答える
5
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++ 標準にない拡張であると文句を言う人もいるでしょう…)

于 2011-01-25T16:15:53.413 に答える
2

bindとはメソッドではなくフィールドとして公開されているためfirst、これを単独で実行することはできません (したがって、 のようなものを使用することはできません)。secondmem_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;
    }
};
于 2011-01-25T16:12:56.713 に答える