多维数组的目的以及何时使用它们

Purpose of multidimensional arrays and when to use them?

本文关键字:何时使 数组      更新时间:2023-10-16

所以我已经开始学习在c++编码,我刚刚开始对数组,但我只是不理解多维数组的概念,它节省内存,使程序更快或其他什么?在什么情况下我应该使用它们?

谢谢

答案不是C或c++。

想象一个棋盘,它有一些方块。每个方格上都可以有一个棋子。您可以将每个方格的状态存储在数组中。

如果你将方块编号为0,1,2,3…63,那么你可以将它们放入一维数组中。向左加1,向右减1,向下加宽度(8),向上减宽度(8)(有一些边界检查)

或者你可以使用二维数组0…7,0…7现在你不加8,你只加1到y维。请注意,计算机最终将其全部转换为一维,但C和c++数组没有边界检查,您必须不断告诉它宽度。库中有一些很好的类可以使事情变得更容易。

也可以设置3、4、5或其他任何维度

你会在实践中得到它!在很多情况下,你会使用二维数组,因为仅仅使用一个简单的数组是不够的,比如简单的回溯问题,比如迷宫,数独,李氏算法。或者另一个例子:您有一个班级学生的数据表,列是每个学生的数据,但是raw可以是:第一个raw是平均成绩,第二个raw是他的身高,第三个raw是他的数字,等等

在实践中,不要在C或c++中使用多维数组。只要使用一个单一维度的数组,也许通过创建一个包含它的class和一些getter和setter方法。

然而,在许多情况下,您将使用容器的容器,例如std::set<std::vector<long>>或偶尔std::vector<std::array<double,3>>等类型…

使用raw 2D数组的实用异常可能用于维度为编译时常量的矩阵。因此,三维线性变换(从R3到自身)可以用double m[3][3];表示;然后一个好的优化编译器甚至可以对代码进行矢量化。

但是对于一个只有在运行时才知道两个维度的矩阵,使它成为一个二维数组通常是一个错误或过度(这就是为什么STL不提供std::matrix模板)。您可以使用std::vector<std::vector<double>>,但这需要分配矩阵的每一行。

当然,你会发现很多现有的线性代数库,如LAPACK, BLAS等…使用它们进行2D或3D计算。其中一些甚至可能使用硬件加速(例如使用OpenCL在GPGPU上运行)。

更一般地说,您应该经常使用和组合现有的c++标准容器(甚至可以通过组合现有的容器来定义您自己的模板)。