我有std::map<int, std::pair<short, float> >
,我需要在此地圖中找到最小short
。我如何使用boost::bind
與std::min_element()
這個?如何在複合類型上使用Boost.Bind?
boost::lambda
?
我有std::map<int, std::pair<short, float> >
,我需要在此地圖中找到最小short
。我如何使用boost::bind
與std::min_element()
這個?如何在複合類型上使用Boost.Bind?
boost::lambda
?
的map
迭代器會給你一個pair
其中first
是int
鍵,second
是地圖的pair
值,所以如果你^ h廣告迭代器it
,您希望所有值的最小值爲it->second.first
。 min_element
函數需要第三個參數的比較函數,因此您需要構建一個比較函數,其中兩個參數的項目爲second.first
。
我們會與一些類型定義開始使代碼更易讀:
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
一起使用。
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;
}
};
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++標準...)
在某些C++庫中也被稱爲`select1st`。 – ephemient 2011-01-25 16:17:44
@ephemient:真的 - 不知道它已經包含在SGI的STL中。在這種情況下,我會建議以這種方式留下名稱,因爲SGI支持任何類似雙界面的界面,而這個界面只適用於std :: pair。 – 2011-01-25 16:29:06