c++ - 如何从用户定义的函数返回 3D 数组?
问题描述
我想将用户定义函数中的 3 维数组返回到我的main
函数中。
a
让我们考虑一个简单的例子,用于,b
和c
数组的任何特定值;
int*** my_function(int a[], int b[], int c[])
{
for (int i = 0; i < 2; i++)
{
for (int j; j < 2; j++)
{
for (int k; k < 2; k++)
{
array[i][j][k] = a[i] * b[j] * c[k];
}
}
}
return array
}
解决方案
只是备注: anint ***
不适合返回 3D 数组。最多它可以用来返回一个指向指针数组的指针。
由于原始数组不是 C++ 语言中的第一类元素,因此您不能以简单自然的方式从函数返回数组。
可以做什么?
C++ 的简单方法:
不要使用原始数组,但
std::array
如果在编译时固定,或者不是,则为大小std::vector
。然后,您可以构建 ( 并返回向量或std::array
的向量std::array
。注意向量的向量就像一个指针数组:数据不需要是连续的,因此它不等同于 3D 数组。在这里,假设固定大小:std::array<std::array<std::array<int, 2>, 2>, 2> my_function(int a[], int b[], int c[]) { std::array<std::array<std::array<int, 2>, 2>, 2> array; ... return array; }
自定义容器(仍然是现代 C++)
如果您需要在 C++ 中模拟一个 3D 连续容器并让它表现得像一个普通对象(可以从函数返回),您将必须构建一个自定义容器及其访问器方法。它不是非常复杂,但远非微不足道。如果你想那样做,我的建议是使用(1D)向量作为底层存储,以免被原始分配存储的复制、移动、破坏问题所困扰。
C-ish 方式(使用原始数组)。
多维数组必须具有所有维度,但最后一个维度是在编译时定义的。说了这么多,你还是会找到 3 种常见的 C 存储方式:静态存储(可以安全返回,但不是线程安全的)、分配存储(线程安全,但调用者将负责释放它)、调用者提供( caller 负责创建数组并将其传递给被调用函数。我将在这里向您展示第三种方式
typedef int (*int3D)[2][2]; int3D my_function(int a[], int b[], int c[], int3D array) { { for(int i=0; i<2; i++) { ... } return array; }
用法:
int arr[2][2][2]; int3D arr3D = my_function(a, b, c, arr); // after the call, arr3D == arr is true
推荐阅读
- apache-spark - 如何使用 UDF 对 Spark SQL 结果进行后处理
- php - 如何在数组中查找双精度值并组合双精度值
- javascript - UnhandledPromiseRejectionWarning: CastError: Cast to ObjectId failed for value "get-votes at path "_id" for model "Data"
- ios - UITextView 设置为空,返回 UIViewController 时不会更新
- scala - 如何在Scala中获取方法或对象的包?
- java - 测试源码目录Maven
- python - Odoo 10 中缺少静态内容
- r - 如何使用 read.big.matrix 读取 r 中的多个文件?
- c# - 如何从另一个属性中获取属性值?
- reactjs - 处理搜索点击将路由到 URL 和 redux 上的同时调度功能