2017-06-08 82 views
0

我有一個問題,通常很適合Java流,但我目前正在使用C++ 11。C++中的地圖過濾和摺疊

我會解決的Java這個問題的方法是:

int solution = myList.stream() //myList is an arraylist of MyClass 
    .mapToInt(MyClass::GetInt) 
    .sum(); 

探索C++標準庫一點後,我瞭解到, std::transformstd::accumulate存在。

我唯一的問題是,std::transform看來似乎只能從T類型映射到鍵入T,在這裏我需要從T類型映射到輸入V(整數),這樣我纔可以累積。

理想情況下,我希望能夠將這個邏輯鏈接在一起,而不是讓臨時數組存儲每個步驟的中間結果。

有沒有一種慣用的C++ 11的方法來實現這一點?

+1

閱讀再次提供'accumulate'的文檔。然後再次。 –

+1

「似乎只能從T型到T型」 - 你確定嗎? –

回答

0

std::transform可以轉換爲不同的類型,但在這裏甚至不需要。你可以只用std::accumulate使用自定義操作,如:

int solution = std::accumulate(
    begin(myList), end(myList), 0, 
    [](int v, const MyClass &c) { return v + c.GetInt(); } 
); 

的另一種方式,很接近您已經發布了Java例子,將使用Boost.Range庫:

int solution = boost::accumulate(
    myList | boost::adaptors::transformed(boost::mem_fn(&MyClass::GetInt)), 
    0 
); 
+0

正是我在找什麼,謝謝! – dustinroepsch