在算法中,我可以使用max来计算两个值的最大值;是否有任何快速方法可以计算三个或更多值的最大值。
答案 0 :(得分:5)
如果使用c ++ 11,则可以使用初始化列表:
int max = std::max({a,b,c,d});
答案 1 :(得分:0)
int max1 = std::max(x, y);
int final_max = std::max(max1, z);
或std::max_element
:
// min_element/max_element example
#include <iostream> // std::cout
#include <algorithm> // std::min_element, std::max_element
bool myfn(int i, int j) { return i<j; }
struct myclass {
bool operator() (int i,int j) { return i<j; }
} myobj;
int main () {
int myints[] = {3,7,2,5,6,4,9};
// using default comparison:
std::cout << "The smallest element is " << *std::min_element(myints,myints+7) << '\n';
std::cout << "The largest element is " << *std::max_element(myints,myints+7) << '\n';
// using function myfn as comp:
std::cout << "The smallest element is " << *std::min_element(myints,myints+7,myfn) << '\n';
std::cout << "The largest element is " << *std::max_element(myints,myints+7,myfn) << '\n';
// using object myobj as comp:
std::cout << "The smallest element is " << *std::min_element(myints,myints+7,myobj) << '\n';
std::cout << "The largest element is " << *std::max_element(myints,myints+7,myobj) << '\n';
return 0;
}
答案 2 :(得分:0)
快速,constexpr
(编译时)和通用(live example):
template <typename F>
struct fold
{
template <typename A>
constexpr typename std::decay <A>::type
operator()(A&& a) const { return std::forward <A>(a); }
template <typename A, typename... An>
constexpr typename std::common_type <A, An...>::type
operator()(A&& a, An&&... an) const
{ return F()(std::forward <A>(a), operator()(std::forward <An>(an)...)); }
};
struct max_fun
{
template <typename A, typename B>
constexpr typename std::common_type <A, B>::type
operator()(A&& a, B&& b) const
{ return a > b ? std::forward <A>(a) : std::forward <B>(b); }
};
using max = fold <max_fun>;
int main ()
{
cout << ::max()(5, 9, -2, 0.1) << endl;
}
这比任何涉及容器上的运行时迭代的解决方案都要快,因为没有指针递增且没有解除引用。它等同于三元?:
运算符的硬编码序列。
它接受任意类型的任意数量的参数,只要为它们定义std::common_type
。
作为constexpr
函数,它可用于在编译时计算整数值并使用它,例如作为模板参数。
只需将max
替换为另一个函数对象,即可轻松进行{{1}}以外的任何折叠/缩小/累积操作。