是否有任何快速方法来计算最多三个值

时间:2014-03-27 12:09:35

标签: c++ stl

在算法中,我可以使用max来计算两个值的最大值;是否有任何快速方法可以计算三个或更多值的最大值。

3 个答案:

答案 0 :(得分:5)

如果使用c ++ 11,则可以使用初始化列表:

int max = std::max({a,b,c,d});

工作示例http://ideone.com/36g1eq

参考:http://www.cplusplus.com/reference/algorithm/max/

答案 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;
}

http://www.cplusplus.com/reference/algorithm/max_element/

答案 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}}以外的任何折叠/缩小/累积操作。