如何声明可以在整个程序中使用的全局 2d 3d 4d ...数组(堆版本)变量?

Posted

技术标签:

【中文标题】如何声明可以在整个程序中使用的全局 2d 3d 4d ...数组(堆版本)变量?【英文标题】:How to declare a global 2d 3d 4d ... array (heap version) variable that could be used in the entire program? 【发布时间】:2019-03-30 03:17:21 【问题描述】:

class1.cpp

int a=10; int b=5; int c=2;
//for this array[a][b][c]

int*** array=new int**[a];


for(int i =0; i<a; i++)
 
    array[i] = new int*[b];        
    for(int k =0; k<b; k++) 
    
       array[i][k] = new int[c];
      

如何在其他 .cpp 文件中使用这个数组?

【问题讨论】:

使用向量的向量...您可能不需要那么多维度。 哎呀——不要!使用漂亮的一维向量并伪造索引.... 这里是一个例子:Create a multidimensional array dynamically in C++ 【参考方案1】:

您至少应该使用std::vector,而不是手动分配数组。你要做的是有一个包含的头文件

extern std::vector<std::vector<std::vector<int>>> data;

您将包含在您希望与之共享向量的所有 cpp 文件中,然后在单个 cpp 文件中包含

std::vector<std::vector<std::vector<int>>> data = std::vector<std::vector<std::vector<int>(a, std::vector<std::vector<int>>(b, std::vector<int>(c)));

现在您将拥有一个共享的全局对象,并且它具有托管生命周期。


你不应该真的使用嵌套向量。它可以将数据分散在内存中,因此对缓存不是很友好。您应该使用具有单维向量的类,并使用数学假设它具有多个维度。一个非常基本的例子看起来像

class matrix

    std::vector<int> data;
    int row; // this really isn't needed as data.size() will give you rows
    int col;
    int depth;
public:
    matrix(int x, int y, int z) : data(x * y * z), row(x), col(y), depth(z) 
    int& operator()(int x, int y, int z)  return data[x + (y * col) + (z * col * depth)]; 
;

然后头文件就是

extern matrix data;

单个 cpp 文件将包含

matrix data(a, b, c);

【讨论】:

不能再同意了。性能需要一个连续的向量。【参考方案2】:

首选 std::arraystd::vector 而不是原始数组。你有恒定的尺寸,所以使用std::array。 在头文件中声明:

// header.h
#pragma once  // or use multiple inclusion guards with preprocessor
#include <array>

const int a = 10;
const int b = 5;
const int c = 2;

using Array3D = std::array<std::array<std::array<int,c>,b>,a>;

extern Array3D array3d;  // extern indicates it is global

在cpp文件中定义:

// class1.cpp
#include "header.h"

Array3D array3d;

然后将标题包含在您想要使用的任何位置。

// main.cpp
#include "header.h"

int main()

    array3d[3][2][1] = 42; 
 

【讨论】:

【参考方案3】:

我不确定我是否明白你的意思,只是简单地说:

class1 obj1;
obj1.array[i][j][k] // assuming you make the array public and already initialized in the constructor(and dont forget to delete it in the destructor)

【讨论】:

不显示 class1 是如何定义的,这不是很有帮助。

以上是关于如何声明可以在整个程序中使用的全局 2d 3d 4d ...数组(堆版本)变量?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C++ 的主函数中为全局声明的 2d 向量分配大小?

使用Cuda平行降维(3D到2D,总和)

如何在 Qt 中创建 3D 对象模型的 2D 切片?

PHP函数声明

Unity3D性能优化总结

俄罗斯方块(2D3D)