在<math.h>
C 语言的库中,该函数fmin(x,y)
返回两个参数 x 和 y 的最小值,如C++ 参考中所述。
但是,是否有类似的函数fminimum(a,b,c,...x,y,z)
可以找到相同数据类型的三个或更多参数的最小值?
注意:该问题最初标记为 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 中,你不能真正做到这一点。所以需要有其他的方法。
一种方法是使用<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()
。