2011-05-11 39 views
1

我有一個std::tr1::unordered_map<int, A> map;其中A是一個帶有成員變量(int x)的類。C++:使用boost lambda在std :: tr1 :: unordered_map中獲取最大值

我想找到地圖中的關鍵字i,使得map [i] .x是最大的。

我知道我可以用std :: max_element寫一個仿函數。我該怎麼做,而不是使用 boost lambda(我試圖去學習它)?我沒有C++ 0x。

作爲一個額外的問題,如果我已經類A定義如下的內容:

類A { INT X; int y; };

我想找到最大值w.r.t x(如果最大值爲0,找到y的最大值)。 同樣,一種解決方案是遍歷地圖的元組(保持內存中最大值爲 )。有沒有辦法修改max_element來做到這一點?

回答

2

boost.lambda使用boost.bind來訪問成員變量。它配備了一個有點羅嗦:

typedef std::tr1::unordered_map<int, A> map_t; 
map_t m; 

A max_a = std::max_element(m.begin(), m.end(), 
       bind(&A::x, bind(&map_t::value_type::second, _1)) 
       < bind(&A::x, bind(&map_t::value_type::second, _2)) 
     )->second; 

測試:https://ideone.com/V6SZL

您可以節省一半的頭痛boost.range

A max_a = *boost::max_element(m | map_values, bind(&A::x, _1) < bind(&A::x, _2)); 

但在實踐中,我認爲,一個仿函數將是最好的。

1

由於您剛剛開始學習Boost.Lambda,現在是完美的時候忘記它存在並學習Boost.Phoenix。 Boost.Phoenix是替代Boost.Lambda是相當更強大,而且往往更簡潔:

typedef std::tr1::unordered_map<int, A> map_t; 
map_t m; 

int i = std::max_element(
    m.begin(), 
    m.end(), 
    bind(&A::x, at_c<1>(_1)) < bind(&A::x, at_c<1>(_2)) 
)->first; 
A& max_a = m[i]; 

注意Boost.Phoenix v2是目前的Boost.Spirit一個子庫,但在1.47.0提升。 Phoenix v3預計將作爲一個適當的獨立Boost庫發佈。

+0

我希望看到一個鳳凰解決方案,謝謝。 – Cubbi

相關問題