我有std::map<int, std::pair<short, float> >
,我需要在此地图中找到最小short
。如何将boost::bind
与std::min_element()
一起使用?
boost::lambda
?
答案 0 :(得分:6)
map
迭代器将为您提供pair
,其中first
为int
密钥,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
。
答案 1 :(得分: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 ++标准中......)
答案 2 :(得分:2)
bind
不能单独执行此操作,因为first
和second
是作为字段公开的,而不是方法(因此您无法使用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;
}
};