我目前正在学习数组及其工作原理。我给出了以下函数,用于查找三个不同数组A,B和C中的最大元素:
void findMax(int A[], int B[], int C[])
{
int maxA = A[0], maxB = B[0], maxC = C[0];
for (int i = 1; i < MAX_LEN; i++)
{
if(maxA < A[i]) maxA = A[i];
if(maxB < B[i]) maxB = B[i];
if(maxC < C[i]) maxC = C[i];
}
}
我的目标是弄清楚如何在不添加额外参数的情况下返回所有三个值(maxA,maxB,maxC)。我被允许更改返回类型,我可以在函数外部编写代码。
我的第一个想法是将void更改为int并创建一个具有这三个最大值的新数组。但是,我认为我需要返回数组的指针,但我们还没有学到这一点。
答案 0 :(得分:2)
有几种方法可以解决这个问题。
最简单的方法是让函数返回int[]
。这样可以轻松地以简洁的格式返回所有值。但是,int[]
类型不能保证其大小为3或包含您声明它包含的内容,因此这不是一种非常类型友好的方法。
大多数JAVA爱好者会告诉你制作一个包含这个想法的结构或类,比如这个。
struct MaxVals {
int maxA;
int maxB;
int maxC;
// Possibly a constructor here
};
这仍然是一种非常节省内存的解决方案,并且比阵列方法更清晰。它还具有更加类型安全的好处;你现在不能制作一个MaxVals
有四个或两个int
;它在编译时保证有3.然而,这是笨重的。它要求你定义一个完全在你的函数之外的新类型,它只会在这种情况下使用。
这是C ++的一个新功能,改编自Python和Haskell,所以它只适用于C ++ 11,它对编译器的支持有限。元组是tuple
标头中的新数据结构,它可以保证在编译时指定的任何类型的异构,固定大小的数据结构。您可以将返回类型设置为std::tuple<int, int, int>
,并使用std::make_tuple(maxA, maxB, maxC)
初始化结构。
这种方法与结构方法具有相同的内存优势和保证,但没有声明一次性类型的所有开销和样板。如果您的编译器支持,这将是解决此类问题的理想方法。
答案 1 :(得分:0)
你可以做两件事:
第一个是在函数(全局)旁边声明maxA, maxB, maxC
。然后在findMax函数和main函数中访问它们。
int maxA, maxB, maxC;
void findMax(int A[], int B[], int C[])
{
maxA = A[0], maxB = B[0], maxC = C[0];
for (int i = 1; i < MAX_LEN; i++)
{
if(maxA < A[i]) maxA = A[i];
if(maxB < B[i]) maxB = B[i];
if(maxC < C[i]) maxC = C[i];
}
}
第二种是使用结构。
struct node
{
int maxA,maxB,maxC;
};
struct node findMax(int A[], int B[], int C[])
{
struct node Max_node;
Max_node.maxA = A[0], Max_node.maxB = B[0], Max_node.maxC = C[0];
for (int i = 1; i < MAX_LEN; i++)
{
if(Max_node.maxA < A[i]) Max_node.maxA = A[i];
if(Max_node.maxB < B[i]) Max_node.maxB = B[i];
if(Max_node.maxC < C[i]) Max_node.maxC = C[i];
}
return Max_node;
}
P.S:你也可以使用指针,但正如你所说,你不熟悉它们,我还有其他方法。