如何在C+中正确使用动态分配的多维数组+; 如何定义C++中的动态多维数组?例如,二维数组?我尝试使用指针指向指针,但不知怎么说,它是失败的。 < P>首先应该认识到C++中没有多维数组支持,既可以是语言特征,也可以是标准库。所以我们在这里面所能做的一切都是对它的模仿。比如说,我们如何模拟二维整数数组?这里有不同的选择,从最不合适到最合适 不当企图#1。使用指针对指针

如何在C+中正确使用动态分配的多维数组+; 如何定义C++中的动态多维数组?例如,二维数组?我尝试使用指针指向指针,但不知怎么说,它是失败的。 < P>首先应该认识到C++中没有多维数组支持,既可以是语言特征,也可以是标准库。所以我们在这里面所能做的一切都是对它的模仿。比如说,我们如何模拟二维整数数组?这里有不同的选择,从最不合适到最合适 不当企图#1。使用指针对指针,c++,arrays,dynamic-arrays,C++,Arrays,Dynamic Arrays,如果用指向类型的指针模拟数组,那么二维数组肯定应该用指向类型指针的指针模拟吗?像这样的 int** dd_array = new int[x][y]; 这是一个编译器错误。并没有新的[][]操作符,所以编译器很乐意拒绝。好吧,怎么样 int** dd_array = new int*[x]; dd_array[0][0] = 42; 这就是汇编。在执行时,它会因不愉快的消息而崩溃。出了点问题,但是什么?当然我们确实为第一个指针分配了内存-它现在指向一个内存块,其中包含指向int的x个指针。但

如果用指向类型的指针模拟数组,那么二维数组肯定应该用指向类型指针的指针模拟吗?像这样的

int** dd_array = new int[x][y];
这是一个编译器错误。并没有新的[][]操作符,所以编译器很乐意拒绝。好吧,怎么样

int** dd_array = new int*[x];
dd_array[0][0] = 42;
这就是汇编。在执行时,它会因不愉快的消息而崩溃。出了点问题,但是什么?当然我们确实为第一个指针分配了内存-它现在指向一个内存块,其中包含指向int的x个指针。但是我们从未初始化过这些指针!让我们再试一次

int** dd_array = new int*[x];
for (std::size_t i = 0; i < x; ++i)
   dd_array[i] = new int[y];

dd_array[0][0] = 42;
现在,这太可怕了。语法很难看,手动管理所有这些指针。。。不。让我们放弃一切,做点更好的事

减少不当尝试#2。使用
std::vector的
std::vector
嗯。我们知道,C++中不应该使用手动内存管理,这里有一个方便的<代码> STD::vector < /代码>。那么,我们能做到这一点吗

std::vector<std::vector<int> > dd_array;
将导致对许多独立分配的内部向量进行迭代。由于CPU只缓存连续内存,所以这些小的独立向量不能全部缓存。无法缓存时会影响性能

那么,我们如何做才是正确的呢

正确的尝试#3-一维! 我们根本不知道!当情况需要二维向量时,我们只需通过编程使用一维向量并使用偏移量访问它的元素!我们就是这样做的:

vector<int> dd_array(x * y);
dd_array[k * x + j] = 42; // equilavent of 2d dd_array[k][j]
矢量dd_数组(x*y);
dd_数组[k*x+j]=42;//二维dd_阵列的等距[k][j]

这给了我们美妙的语法、性能和所有的荣耀。为了让我们的生活稍微好一点,我们甚至可以在一个一维向量上构建一个适配器——但这是留给家庭作业的。

,但值得补充的是,更恰当的尝试4:将1D数组包装在一个对象中,以减少在索引数学中键入错误的几率,当它在其他地方工作时,它会在一个地方使您感到困惑。就在这里,最后一句话。留作家庭作业:)是否值得为其他维度添加一个示例,例如,如果来自C#的人可能想要使用三维数组?我以C#为例,因为该语言支持多维数组。在正常情况下,是的,但对于这样一个自我回答的问题,我会包含一个真正基本的完整性包装。除非你打算续集:老兄,我的“操作员[][]”在哪里?有时有理由使用2而不是3。例如,如果数组非常大,使用#3增加行数可能会由于OOM而失败,或者触发大规模重新分配和复制;尽管#2没有这个问题(即使它重新分配,现有的行也会保持不变)@JustinMeiners是可能的,但问题是如何使用,而不是如何定义。对于这个问题,最顶尖的答案得出的结论是错误的。在任何人得到一半正确答案之前,你必须下降大约550票。
std::vector<std::vector<int> > dd_array(x);
for(auto&& inner : dd_array)
    inner.resize(y);

dd_array[0][0] = 42;
int sum = 0;
for (auto&& inner : dd_array)
    for (auto&& data : inner)
       sum += data;
vector<int> dd_array(x * y);
dd_array[k * x + j] = 42; // equilavent of 2d dd_array[k][j]