2012-07-24 15 views
18

Ich versuche std::accumulate mit std::min zu kombinieren. So etwas (wird nicht kompiliert):Ist es möglich, std :: accumulate mit std :: min zu verwenden?

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

Ist es möglich? Ist es möglich ohne Wrapper Funktor für std::min zu schreiben?
Ich weiß, dass ich dies mit lambda tun kann:

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

Und ich weiß, gibt es std::min_element. Ich versuche nicht, Min-Element zu finden, ich muss std::accumulate mit std::min (oder ::min) für meine Bibliothek kombinieren, die Funktion-Programmierung wie Ausdrücke in C++ ermöglicht.

Antwort

19

Das Problem ist, dass es 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); 

daher Ihr Code nicht eindeutig ist, der Compiler nicht weiß, welche zu wählen, überlastete. Sie können Sie angeben, welche durch einen Zwischenfunktionszeiger mit:

#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

Sie könnten auch einen hässlichen Guss verwenden '(const int & (*) (const int &, const int &)) std :: min '. –

+3

Ich neige dazu, die Lambda-Version besser zu mögen. – moooeeeep

+4

@JesseGood: y kein 'static_cast'? : \ – Mehrdad

Verwandte Themen