この機能をよりエレガントにする方法はありますか?私は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;
}
多くの改善点があります。
標準関数を使用して、より明確にすることができます。
// 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;
}
可能であれば、独自の関数( std :: min )を実装せずに目的の結果を計算できるC++ 11以降を使用することをお勧めします。コメントのいずれかで既に指摘したように、次のことができます
_T minimum(std::min({x, y, z}));
_
または
_T minimum = std::min({x, y, z});
_
変数x
、y
、およびz
の最小値をタイプminimum
の変数T
に格納します(x
、y
、および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);
}
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)
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 ...); }
それらをベクターに保存し、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());
小さな変更
int smallest(int x, int y, int z){
int smallest = min(x,y);
return min(smallest,z);
}
ご使用のバージョンでは、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;
}
または、defineを使用してマクロ関数を作成できます。
#define min(x,y,z) (x < y ? (x < z ? x : z) : (y < z ? y : z))
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
}