如何将不同大小的数组传递给我的 C++ 函数?

how to pass an array with different sizes to my c++ function?

本文关键字:我的 C++ 函数 数组      更新时间:2023-10-16

我不确定这是否可能,但我对想法持开放态度。

我有一个 c++ 函数。它对用户定义为输入的数组进行一些计算,并将生成两个输出值。我们称之为"myfunction",它看起来像这样:

void myfunction(双数组1[18],双数组[9],双

数组[2],双*输出1,双*输出2(

我想使这个函数更通用,以便它能够接受不同大小的数组。意思是,我希望这个函数的用户能够定义其他大小的数组输入。

例如

void myfunction(双数组1[81],双数组

[27],双数组[3],双*输出1,双*输出2(

在数学上,"myfunction"能够计算出准确的输出,尽管数组大小很大。我不想复制"myfunction",因为用户可以将总共 5 组不同的数组大小定义为输入。

有什么想法吗?提前谢谢你

您可以传递std::vector或使用template

template <std::size_t N1, std::size_t N2, std::size_t N3> // and so on...
void work_with_arrays(double (&arr1)[N1], double (&arr2)[N2], double (&arr3)[N3]){
std::cout << "First arr of a size: " << N1 << "n";
std::cout << "Second arr of a size: " << N2 << "n";
std::cout << "Third arr of a size: " << N3 << "n";
};
int main() {
double something[32];
double fewer[13];
double maybe_byte[8];
work_with_arrays(something, fewer, maybe_byte);
}

代码输出:

First arr of a size: 32
Second arr of a size: 13
Third arr of a size: 8

解释:

人们应该知道类型T[](T是任何类型(的参数衰减T*。如果我们处理一个指向数组的指针,我们没有关于其长度的信息,这是非常不幸的,因为固定长度数组的长度在编译时是已知的,并且在我们使用它们的任何地方都可以看到。

还应该知道函数模板不是函数。它是用于创建函数的模板。对于上面示例中使用的每个不同N#集,都会生成一个函数供我们使用。

衰减问题的解决方法是什么?

与其传递原始T[],不如传递对T[]引用。这样类型就不会衰减,数组的大小就会知道。

语法?

人们可能会注意到T (&name)[some_size]看起来至少很奇怪。括号是必需的,因为纯T &name[size]会被解释为T& name[size],这是一个引用数组,而不是对数组的引用

结论:

由于能够检测作为参数传递数组的大小,我们不想将自己限制在一两种情况下 - 我们希望涵盖所有情况,因此我们使用template来生成具有所需值N#的函数。

你可以让你的函数接受一个vector,这是一个"可动态调整大小的数组"。您可以迭代它,或根据需要获取其大小。请参阅其文档。

#include <vector>
using std::vector;  // I'm too lazy to prepend std:: as needed.
void myfunction(const vector<double>& array1, 
const vector<double>& array2,
const vector<double>& array3, 
vector<double>& output1, vector<double>& output2) {
}

如果这是不可能的,那么让它接受额外的参数来指示数组的大小。

void myfunction(double *array1,
double *array2, 
double *array3,
int size1,
int size2,
int size3,
double *output1, 
double *output2) {
}

但这真的很丑陋。只需选择第一个选项即可。