2012-07-24 11 views
18

std::accumulatestd::minを組み合わせようとしています。このようなもの(コンパイルされません):std :: minulateでstd :: accumulateを使用することはできますか?

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

可能でしょうか? std::minのラッパーファンクタを記述せずに行うことはできますか?
は、私はラムダでこれを行うことができることを知っている:

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); 

したがって、あなたのコードは曖昧で、コンパイラは選択するオーバーロードしているかを知りません。あなたは中間関数ポインタを使用することによって必要な1述べることができる:

#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 ::分'。 –

+3

私はラムダ版が好きです。 – moooeeeep

+4

@ JesseGood:y uいいえ 'static_cast'ですか? :\ – Mehrdad

関連する問題