如何将不同大小的数组传递给我的 C++ 函数?
how to pass an array with different sizes to my c++ function?
我不确定这是否可能,但我对想法持开放态度。
我有一个 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) {
}
但这真的很丑陋。只需选择第一个选项即可。
- 我的神经网络不起作用 [XOR 问题]
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 我的字符计数代码计算错误.为什么
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- cmake在我的项目中所需的所有静态库都不成功
- 为什么我的代码在输出中增加了93天
- 我的简单if-else语句是如何无法访问的代码
- 为什么我的for循环不能正确获取argv
- 我的项目不会像"undefined reference to `grpc::g_core_codegen_interface'"那样使用未定义的引用错误进行编译
- 0-1背包代码中的错误.我的代码中有什么错误
- 当我的阵列太大时出现分段错误
- 如何确认我的constexpr表达式实际上已经在编译时执行
- 为什么二进制搜索在我的测试中不起作用
- 如何指定我希望我的LIB链接到的DLL文件?-Visual Studio 2019
- 我的代码中有错误吗?使用BGI图形的C++代码对我不起作用
- 当我在main中声明了我的2d数组时,为什么我的程序会退出
- OpenGL在启用深度测试时不会丢弃我的碎片
- 为什么我的 std::ref 无法按预期工作?
- clang整洁10忽略了我的NOLINT命令
- 为什么我的删除节点函数实际上没有删除节点?