21

と組み合わせようとしてstd::accumulatestd::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。私は最小要素を見つけようとはしていません.C ++での式のような関数プログラミングを可能にするライブラリの(または)std::accumulateと組み合わせる必要があります。std::min::min

4

2 に答える 2

24

問題は、関数のオーバーロードがいくつかあるminことです:

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);
}
于 2012-07-24T07:59:23.573 に答える
0

C++20 から、 std::範囲::minを使用できます

#include <algorithm>
#include <iostream>
#include <vector>
#include <numeric>
#include <climits>

int main() {
    std::vector<int> v{1,2,3,47,5};
    std::cout << std::accumulate(v.begin(), v.end(), INT_MAX, std::ranges::min) << std::endl; 
    std::cout << std::accumulate(v.begin(), v.end(), INT_MIN, std::ranges::max) << std::endl; 
}

1
47

std::ranges::accumulateC++20 では行われていないため、 がないことに注意してください。

于 2021-09-15T16:01:24.167 に答える