web-dev-qa-db-ja.com

C ++の3つの数字の中で最小のものを見つける

この機能をよりエレガントにする方法はありますか?私は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;
}
26
user1145538

多くの改善点があります。

標準関数を使用して、より明確にすることができます。

// 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で動作させたい場合、次のようなことができます。

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

また、単にintではなく、任意の型で動作するようにジェネリックにすることもできます

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;
}
43
Alex

可能であれば、独自の関数( std :: min )を実装せずに目的の結果を計算できるC++ 11以降を使用することをお勧めします。コメントのいずれかで既に指摘したように、次のことができます

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

または

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

変数xy、およびzの最小値をタイプminimumの変数Tに格納します(xy、およびzは同じタイプであるか、暗黙的に変換可能である必要があります)。同様に、最大値std::max({x, y, z})を取得するために同じことができます。

return min(x、min(y、z))を書けるように、三項演算子があります:

float smallest(int x, int y, int z){
  return x < y ? (x < z ? x : z) : (y < z ? y : z);
}
9
CapelliC
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)
5
Martin James

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 ...); }
2
tgoodhart

それらをベクターに保存し、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());
1
user3926526

小さな変更

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

ご使用のバージョンでは、99999より小さい場合にのみ最小値を見つけます。

3つの値すべてを一緒に比較する必要があります。また、intを取得していますが、floatを返しています。処理する値の種類を決定するか、比較可能な任意の種類で機能する汎用バージョンを作成できます。

#include <algorithm>

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

編集:

コードをvectorで動作するものに改善する2つの方法:

#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;
}
1

または、defineを使用してマクロ関数を作成できます。

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

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])に格納し、配列を並べ替えてarray [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
    }
1