-1

Cの<math.h>ライブラリでは、関数fmin(x,y)は 2 つの引数 x と y の最小値を返します。たとえば、C++ リファレンスに記載されています。

ただし、fminimum(a,b,c,...x,y,z)同じデータ型の 3 つ以上の引数の最小値を見つける同様の関数はありますか?

4

4 に答える 4

11

: 質問はもともと 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などbcすべて一式対応operator<です。

于 2013-08-28T12:43:29.410 に答える
5

昔ながらのやり方...

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;
}
于 2013-08-28T12:51:08.680 に答える
3

「任意の数の引数」の問題は、いくつあるかをどうやって知るかです。

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)));; 
于 2013-08-28T12:53:24.910 に答える
0

これを実行できる唯一の libc 関数は、並べ替えと同様に、はるかに多くのことを実行できますが、これはやり過ぎと見なすことができます。ですqsort()

于 2013-08-28T12:53:21.383 に答える