Cの<math.h>
ライブラリでは、関数fmin(x,y)
は 2 つの引数 x と y の最小値を返します。たとえば、C++ リファレンスに記載されています。
ただし、fminimum(a,b,c,...x,y,z)
同じデータ型の 3 つ以上の引数の最小値を見つける同様の関数はありますか?
Cの<math.h>
ライブラリでは、関数fmin(x,y)
は 2 つの引数 x と y の最小値を返します。たとえば、C++ リファレンスに記載されています。
ただし、fminimum(a,b,c,...x,y,z)
同じデータ型の 3 つ以上の引数の最小値を見つける同様の関数はありますか?
注: 質問はもともと C++ とタグ付けされていました。元の回答は C++ でのみ機能しますが、同じ原則に従う C ソリューションを提供しました。
アイデアは、範囲の開始と終了を表すポインターのペアが関数に渡され、最小要素へのポインターが返されるというものです。
int* min_element(int *start, int *end)
{
if (start == end) return end;
int *min = start++;
for (; start != end; ++start)
if (*start < *min) min = start;
return min;
}
使用法:
int data[] = {1, 5, 3, 66, 4, 81, 23, 2, 6};
int * min = min_element(data, data + 9);
if (min != data + 9)
{
// range was not empty, min value is *min
}
元のC++
回答
There is はstd::min_element
、イテレータのペアで指定された範囲内の最小要素へのイテレータを提供します。
int arr[] = { 3,1,6,8,9,34,17,4,8};
auto it = std::min_element(std::begin(arr), std::end(arr));
編集2:削除された回答から、C++ 11にはstd::min
を取るオーバーロードがあるinitializer_list
ため、次のように言うことができます
auto minval = std::min({a, b, c, x, y, z});
、、a
などb
はc
すべて一式対応operator<
です。
昔ながらのやり方...
int arr[] = { 1, 3, 6, 100, 50, 72 };
int min_array( int arr[], int len )
{
int min = arr[0];
for ( int i = 1; i < len; i++ )
if ( arr[i] < min )
min = arr[i];
return min;
}
「任意の数の引数」の問題は、いくつあるかをどうやって知るかです。
std::min
コンテナを操作することでこれを回避します。std::min_element
つまり、コンテナ オブジェクト自体がいくつを知っているので、コンテナの数を知ることができます。
プレーンな C では、実際にそれを行うことはできません。したがって、他の方法が必要です。
1 つの方法は、 を使用<cstdarg>
し、特別な値で末尾をマークすることです。
#include <iostream>
#include <cstdarg>
using namespace std;
int countargs(int arg, ...)
{
if (arg == -1)
return 0;
int count = 1; // arg is not -1, so we have at least one arg.
va_list vl;
int cur;
va_start(vl, arg);
for(;;)
{
cur = va_arg(vl, int);
if(cur == -1)
break;
count++;
}
va_end(vl);
return count;
}
int main()
{
cout << "Should give 0: " << countargs(-1) << endl;
cout << "Should give 1: " << countargs(1, -1) << endl;
cout << "Should give 3: " << countargs(1, 2, 3, -1) << endl;
cout << "Should give 6: " << countargs(1, 2, 3, 1, 2, 3, -1) << endl;
cout << "Should give 12: " << countargs(1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, -1) << endl;
return 0;
}
上記はmin
値を取得する方法を示していませんが、理解するのはそれほど難しくありません。これも C++ ですが、特別な C++ 機能には依存しません。
「終了をマークする」の代わりに、要素の数を関数自体に渡すこともできます。
もちろん、引数が配列内にある場合、実際の解決策はそれらを反復処理することです。それほど多くない場合は、もちろん次を使用できます。
v = min(a, min(b, min(c, d)));;
これを実行できる唯一の libc 関数は、並べ替えと同様に、はるかに多くのことを実行できますが、これはやり過ぎと見なすことができます。ですqsort()
。