在C / C ++的 库中,函数fmin(x,y)返回两个参数x和y的最小值,如the C++ reference中所述。 / p>
但是,是否有类似的函数fminimum(a,b,c,... x,y,z)可用于查找相同数据类型的三个或更多参数的最小值?
编辑:抱歉混淆。这个问题仅限于C,所以没有C ++
答案 0 :(得分:9)
注意:问题最初标记为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++
回答
有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<
的一种类型。
答案 1 :(得分: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;
}
答案 2 :(得分:3)
“任意数量的参数”的问题是你怎么知道有多少。
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)));;
答案 3 :(得分:0)
唯一可以执行此操作的libc函数会做更多事情,因为它会排序,这可能被视为过度杀伤。它是qsort()
。