在C++中传递数组作为函数参数的方法
Methods of passing an array as a function parameter in C++
当作为参数传递到函数中时,只传递指向数组第一个元素的指针。我找到了一个临时的解决方法:
int function(int array[], int size) {
int otherArray[50]; // high enough number
for (int i = 0; i < size; i++) {
otherArray[i] = array[i];
}
// use otherArray
}
有没有一种更高效、更简洁的方法来传递整个数组?这似乎效率极低。
编辑:通过对我的数据使用std::vector,并使用&vec[0]以检索数组。
不能将数组传递给函数。你可以选择近似它:
- 对原始数组的引用
- std::数组
- std::矢量
为了获得最大效率,您不希望复制数组。这就是数组首先会衰减为指针的原因(尽管它是从C继承而来的,并且有更好的方法来实现相同或类似的行为,这样更安全。(如果你想保持类型不衰减,你必须传递对数组或包含这样一个数组的对象的引用。
// pass reference to a raw array (Array of N elements of type T)
template <typename T, int N>
void foo1(T(&arrayArg)[N])
{
std::cout << arrayArg[0] << "n";
}
考虑到你最初在问题中使用的代码,我怀疑上面就是你想要的。然而,也要考虑其他选择,因为数组在c++中不是一种非常健壮的数据类型,并且对于通用代码有更好的选择。
// pass reference to std::array
template <typename T, int N>
void foo2(std::array<N, T> const & arrayArg)
{
std::cout << arrayArg[0] << "n";
}
std::array是一个下面包含原始数组的类,但它有一个更友好的C++接口,并且不受衰减的影响。
// pass reference to std::vector
template <typename T>
void foo2(std::vector<T> const & vecArg)
{
std::cout << vecArg[0] << "n";
}
Vector是动态调整大小的,并且离您开始使用的原始数组越来越远,但它是许多c++数据结构和算法的构建块,在大多数情况下应该是您首先考虑的事情之一。
有一种历史方法可以使用结构将数组按值传递给函数,幸运的是,在c++中有std::array这样的集合,可以按值传递。
你可以在这里阅读更多关于C方式的内容。
相关文章:
- static_assert在宏中,但也可以扩展到可以用作函数参数的东西
- C++中的高效循环缓冲区,它将被传递给C样式数组函数参数
- 当从函数参数中的临时值调用复制构造函数时
- 如何从"decltype()"获取函数参数的数量<funtion>?
- 如何将lambda作为模板类的成员函数参数
- 模板参数推导失败,函数参数/参数不匹配
- 如何在C++中将迭代器作为函数参数传递
- 将函数参数"const char*"转换为"std::string_view"是
- C++ 如何将数组值解压缩为函数参数
- 主函数参数的属性
- 具有两个间接寻址运算符 (C++) 的函数参数的用途
- "Warning: Comma within array index expression"但逗号分隔函数参数
- 如何定义在用作函数参数时工作的类模板的转换
- 将函数参数完美转发到函数指针:按值传递呢?
- 为什么我不能将引用作为 std::async 的函数参数传递
- 什么..(省略号)作为函数原型中唯一的函数参数,C++?
- 是否可以就地构造一个固定大小的数组作为函数参数?
- 接受模板作为函数参数
- 将成员函数作为构造函数参数调用时出错 "Variable is not a type name"
- Arduino 函数参数