Pra*_*rma 5 c++ arrays function multidimensional-array c++11
我想将一个 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
}
Run Code Online (Sandbox Code Playgroud)
只是备注: 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;
}
Run Code Online (Sandbox Code Playgroud)
自定义容器(仍然是现代 C++)
如果您需要在 C++ 中模拟 3D 连续容器并使其表现得像普通对象(可以从函数返回),则必须构建自定义容器及其访问器方法。它并不是极其复杂,但也绝非微不足道。如果你想这样做,我的建议是使用(1D)向量作为底层存储,这样就不用担心原始分配存储的复制、移动、破坏问题。
C-ish 方式(使用原始数组)。
多维数组必须具有除最后一个维度之外的所有维度,这是在编译时定义的。话虽如此,你仍然会发现 3 种常见的 C 存储方式:静态存储(可以安全返回,但不是线程安全的)、分配存储(线程安全,但调用者将负责释放它)、调用者提供的(调用者负责创建数组并将其传递给被调用者函数。我将在这里向您展示第三种方法
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;
}
Run Code Online (Sandbox Code Playgroud)
用法:
int arr[2][2][2];
int3D arr3D = my_function(a, b, c, arr);
// after the call, arr3D == arr is true
Run Code Online (Sandbox Code Playgroud)
使用指针的更好替代方法是使用std::vectoras ,它将处理内存分配和释放的细节。
如何初始化3D向量?
3D 矢量只是一个内部包含两个其他矢量的矢量。因此,如果您想用值 A 初始化大小为 X * Y * Z 的 3D 向量,则可以这样做:
vector<vector<vector<int> > > vec (X,vector<vector<int> >(Y,vector <int>(Z,A)))
Run Code Online (Sandbox Code Playgroud)
如何从函数中返回它?
您可以从下面的示例中了解如何返回它。
vector<vector<vector<int> > > sample_function()
{
//sample code
return vec;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2391 次 |
| 最近记录: |