2012-07-24 64 views
18

我正在嘗試將std::accumulatestd::min結合使用。像這樣的東西(不會編譯):是否有可能使用std :: accumulate和std :: min?

vector<int> V{2,1,3}; 
cout << accumulate(V.begin()+1, V.end(), V.front(), std::min<int>); 

這可能嗎? 有沒有可能爲std::min寫包裝仿函數?
我知道,我可以用lambda表達式做到這一點:

vector<int> V{2,1,3}; 
cout << std::accumulate(
    V.begin()+1, V.end(), 
    V.front(), 
    [](int a,int b){ return min(a,b);} 
); 

而且我知道有std::min_element。我不是想找到最小元素,我需要將std::accumulatestd::min(或::min)結合起來用於我的庫,該庫允許在C++中使用函數式編程(如表達式)。

回答

19

的問題是,有several overloads of the min function

template <class T> const T& min(const T& a, const T& b); 

template <class T, class BinaryPredicate> 
const T& min(const T& a, const T& b, BinaryPredicate comp); 

因此,你的代碼是模糊的,編譯器不知道超載選擇。你能說出你想要哪一種通過使用中間函數指針:

#include <algorithm> 
#include <iostream> 
#include <vector> 

int main() 
{ 
    std::vector<int> V{2,1,3}; 
    int const & (*min) (int const &, int const &) = std::min<int>; 
    std::cout << std::accumulate(V.begin() + 1, V.end(), V.front(), min); 
} 
+2

你可以使用一個醜陋投過'(const int的&(*)(const int的&,const int的&))的std ::分鐘'。 – 2012-07-24 08:07:25

+3

我傾向於更喜歡lambda版本。 – moooeeeep 2012-07-24 08:07:51

+4

@JesseGood:你沒有'static_cast'? :\ – Mehrdad 2012-07-24 08:08:04

相關問題