2011-01-25 46 views

回答

6

map迭代器會給你一個pair其中firstint鍵,second是地圖的pair值,所以如果你^ h廣告迭代器it,您希望所有值的最小值爲it->second.firstmin_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一起使用。

2

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; 
    } 
}; 
+1

在某些C++庫中也被稱爲`select1st`。 – ephemient 2011-01-25 16:17:44

+0

@ephemient:真的 - 不知道它已經包含在SGI的STL中。在這種情況下,我會建議以這種方式留下名稱,因爲SGI支持任何類似雙界面的界面,而這個界面只適用於std :: pair。 – 2011-01-25 16:29:06

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++標準...)

相關問題