-1

<math.h>C 语言的库中,该函数fmin(x,y)返回两个参数 x 和 y 的最小值,如C++ 参考中所述

但是,是否有类似的函数fminimum(a,b,c,...x,y,z)可以找到相同数据类型的三个或更多参数的最小值?

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::minstd::min_element解决这个问题——换句话说,我们知道有多少,这要归功于容器对象本身知道有多少。

在普通的 C 中,你不能真正做到这一点。所以需要有其他的方法。

一种方法是使用<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 回答