2012-07-24 4 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에 대한 래퍼 펑터를 쓰지 않고도 가능합니까?
은 내가 람다 함께 할 수 있다는 사실을 알고 :

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 &)) 표준 : 분 '. –

+3

나는 람다 버전을 더 좋아하는 경향이있다. – moooeeeep

+4

@ JesseGood : y u 'static_cast' 아니요? : \ – Mehrdad

관련 문제