c++ - 在 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] 检索数组来解决。
解决方案
您不能将数组传递给函数。您可以选择近似它:
- 对原始数组的引用
- 标准::数组
- 标准::向量
为了获得最大效率,您不想复制数组。这就是为什么数组首先衰减为指针的原因(尽管它是从 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++ 数据结构和算法的构建块,在大多数情况下应该是您首先考虑的事情之一。
推荐阅读
- talend - 如何在同一个子作业中读取和写入 Talend 中的同一个 excel 文件?
- python - 如何将字符串列表与另一个匹配
- python - discord.py - 意外的关键字参数错误
- reactjs - 功能组件嵌套与道具
- c - 检查列表是否为交替值
- c# - PresentationFramework.dll 中的 System.Windows.Markup.XamlParseException' 方法或操作未实现。(材料消息框)
- objective-c - 奇怪的 KERN_INVALID_ADDRESS 异常?
- python - 如何在不引用输出的情况下从 SQL 数据库获取密码?
- vue.js - PrimeVue:带有服务器端分页的数据表
- paypal-rest-sdk - Paypal 智能按钮信用卡填写或隐藏电话号码