找到C ++中3个数字中最小的数字

时间:2012-02-24 01:37:14

标签: c++ max min

有没有办法让这个功能更优雅?我是C ++的新手,我不知道是否有更标准化的方法来做到这一点。这可以变成一个循环,所以变量的数量不受我的代码限制吗?

float smallest(int x, int y, int z) {

  int smallest = 99999;

  if (x < smallest)
    smallest=x;
  if (y < smallest)
    smallest=y;
  if(z < smallest)
    smallest=z;

  return smallest;
}

10 个答案:

答案 0 :(得分:40)

可以做出许多改进。

您可以使用标准功能使其更清晰:

// Notice I made the return type an int instead of a float, 
// since you're passing in ints
int smallest(int x, int y, int z){
    return std::min(std::min(x, y), z);
}

或者更好的是,正如评论中指出的那样:

int smallest(int x, int y, int z){
    return std::min({x, y, z});
}

如果您希望它以任意数量的整数运行,您可以执行以下操作:

int smallest(const std::vector<int>& intvec){
    int smallest = std::numeric_limits<int>::max(); // Largest possible integer
    // there are a number of ways to structure this loop, this is just one
    for (int i = 0; i < intvec.size(); ++i) 
    {
        smallest = std::min(smallest, intvec[i]);
    }
    return smallest;
}

您也可以将其设为通用的,以便它可以在任何类型上运行,而不仅仅是整体

template <typename T>
T smallest(const std::vector<T>& vec){
    T smallest = std::numeric_limits<T>::max(); // Largest possible integer
    // there are a number of ways to structure this loop, this is just one
    for (int i = 0; i < vec.size(); ++i) 
    {
        smallest = std::min(smallest, vec[i]);
    }
    return smallest;
}

答案 1 :(得分:33)

如果可能,我建议使用C ++ 11或更新版本,它允许您计算所需的结果,而无需实现您自己的功能(std::min)。正如其中一条评论中已经指出的那样,你可以做到

T minimum(std::min({x, y, z}));

T minimum = std::min({x, y, z});

将变量xyz的最小值存储在minimum类型的变量T中(请注意xyz必须具有相同的类型,或者必须可以隐式转换为它。相应地,可以采用相同的方法来获得最大值:std::max({x, y, z})

答案 2 :(得分:8)

除了min,让你写回返min(x,min(y,z))有三元运算符:

float smallest(int x, int y, int z){
  return x < y ? (x < z ? x : z) : (y < z ? y : z);
}

答案 3 :(得分:5)

smallest=(x<((y<z)?y:z)t)?x:((y<z)?y:z);

假设,

x is one;
y is two;
z is three;

smallest = (one < ((two < three) ? two:three)) ? one:((two < three) ? two:three)

答案 4 :(得分:2)

有人建议将其包含在N2485下的C ++库中。提案很简单,所以我在下面列出了有意义的代码。显然,这假定了可变参数模板。

template < typename T >
const T & min ( const T & a )
{ return a ; }

template < typename T , typename ... Args >
const T & min ( const T & a , const T & b , const Args &... args )
{ return std :: min ( b < a ? b : a , args ...); }

答案 5 :(得分:1)

一个小修改

 int smallest(int x, int y, int z){
    int smallest = min(x,y);
    return min(smallest,z);
    }

答案 6 :(得分:1)

在您的版本中,只有当它小于99999时才会找到最小值。

您应该将所有三个值进行比较。此外,您收到int但返回float。或者,您应该决定要处理哪种值,或者您可以创建适用于任何可比较类型的通用版本:

#include <algorithm>

template<class T>
T smallest(T x, T y, T z)
{
  return std::min(x, std::min(y, z));
}

编辑:

将代码改进为vector上的代码的两种方法:

#include <cstdio>
#include <algorithm>
#include <vector>

// Use a built-in function to retrieve the smallest value automatically
template<class T>
T smallest1(const std::vector<T> &values)
{
  return *std::min_element(values.begin(), values.end());
}

// Go through the vector manually
template<class T>
T smallest2(const std::vector<T> &values)
{
  // Get the first value, to make sure we're comparing with an actual value
  T best_so_far = values.front();
  // For all the other values in the vector ...
  for(unsigned i = 1; i < values.size(); ++i) {
    // ... replace if the new one is better
    if(values[i] < best_so_far)
      best_so_far = values[i];
  }
  return best_so_far;
}

int main()
{
  // Try out the code with a small vector
  std::vector<int> test;
  test.push_back(6);
  test.push_back(5);
  test.push_back(7);

  printf("%d\n", smallest1(test));
  printf("%d\n", smallest2(test));

  return 0;
}

答案 7 :(得分:1)

1)简单的解决方案:

int smallest(int x, int y, int z)
{
    return std::min(std::min(x, y), z);
}

2)更好的解决方案(在优化方面):

float smallest(int x, int y, int z)
{
  return x < y ? (x < z ? x : z) : (y < z ? y : z);
}

3)您的解决方案已修改(简单但效率不高):

int smallest(int x, int y, int z)
{

  int smallest = x;

  if (y < smallest)
     smallest=y;
  if(z < smallest)
     smallest=z;
  return smallest;
}

4)任意数量的数字:

  

对于n个数字,将其存储在数组(array [n])中,对数组进行排序   使数组[0]变得最小。

    //sort the elements in ascending order
    for(int i=0;i<n;i++)
    {
      if(array[i]>array[i+1])
      {
        int temp = array[i];
        array[i] = array[i+1];
        array[i+1] = temp;
      }
    }

    //display smallesst and largest
    cout<<"Smallest: "<<array[0];
    cout<<"Largest: "<<array[n-1];   //not needed in your case
    }

答案 8 :(得分:1)

或者您可以使用define来创建宏功能。

#define min(x,y,z) (x < y ? (x < z ? x : z) : (y < z ? y : z))

答案 9 :(得分:1)

您可以将它们存储在矢量中并使用std::min_element

例如:

vector<int> values;
values.push_back(10);values.push_back(1);values.push_back(12);

int min = *std::min_element(values.begin(),values.end());