I have an std::vector<int> v1
of size n
, and I want to build an std::vector<int> v2
such as for every i
from [0, n)
v2[i] = max(v1[i], ..., v1[n-1])
.
I wanna use a standard algorithm std::parial_sum
for it, something like
std::partial_sum(v1.rbegin(), v1.rend(), v2.rbegin(), std::max);
The only problem is that it doesn't compile, as I get an couldn't deduce template parameter '_BinaryOperation'
error for std::max
.
Documentation for std::partial_sum
suggests a concise syntax like
std::partial_sum(first, last, d_first, std::plus<>());
but std::plus
is a class with an overloaded operator()
, not a standalone function. What can I do to use std::max
in a similar way?
CodePudding user response:
You cannot use a regular function as a callable object, because functions are not objects.
Either use a lambda:
std::partial_sum(v1.rbegin(), v1.rend(), v2.rbegin(), [](auto lhs, auto rhs) {
return std::max(lhs, rhs);
});
Demo
Note that you can have that lambda as a separate variable too:
auto max = [](auto lhs, auto rhs) { return std::max(lhs, rhs); };
std::partial_sum(v1.rbegin(), v1.rend(), v2.rbegin(), max);
Or make your own callable object:
struct max {
template<typename T>
auto operator()(T const& lhs, T const& rhs) {
return std::max(lhs, rhs);
}
};
// [...]
std::partial_sum(v1.rbegin(), v1.rend(), v2.rbegin(), max{});
CodePudding user response:
You could define your own Max Struct comparator:
template<class T>
struct Mymax{
T& operator()(const T& a, const T& b)
{
return (a < b) ? b : a;
}
};
`