【问题标题】:what is the difference between linear array and multi-dimensional?线性数组和多维有什么区别?
【发布时间】:2016-12-13 11:46:29
【问题描述】:

数组可以是线性的(一维)或多维的。这些数组只要给出相同的结果有什么区别?

我认为数组是内存中相同类型和大小的一组连续地址。这适用于多维数组吗?

#include <iostream>
using namespace std;


int main()
{

    int array1[4]       = {0, 1, 2, 3};
    int array2[1][4]    = {0, 1, 2, 3};
    int array3[1][2][2] = {0, 1, 2, 3};

    cout << array1[0]       << endl; // 0
    cout << array2[0][0]    << endl; // 0
    cout << array3[0][0][0] << endl; // 0

    cout << array1[2]       << endl; // 2
    cout << array2[0][2]    << endl; // 2
    cout << array3[0][1][0] << endl; // 2

    return 0;
}

【问题讨论】:

  • 不同之处在于访问元素的方式。如果你需要一个 3d 结构,你不想写 array3[ i + size_i * j + size_i * size_j * k] 但你想写 array3[i][j][k]
  • @tobi303 这可能有点虚伪,因为空间位置的潜在好处。
  • @erip 不确定我是否理解您的评论.....
  • 二维数组,是数组的数组。它的元素是连续的数组。 3D 数组是 2D 数组的数组。它的元素是连续的二维数组。等等。所以我相信你的直觉是正确的。您应该注意,将所有数组初始化为相同的语法糖。

标签: c++ arrays


【解决方案1】:

多维数组可以表示至少两种方式之一:单个 1x(N*M) 数组,或 N 个 1xM 数组(在内存中也是连续的)。为了符合您的命名法,我们将前者称为线性数组,而将后者称为“多维”数组。

当数组线性存储时,行顺序的语言(如 C++)极大地受益于缓存一致性(由于空间局部性)。在对列进行迭代时,您会发现缓存未命中的频率要高得多。

这显然是缓存大小的函数,以及您认为迭代矩阵的频率,因此在做出重大设计决策之前,请确保它是一个瓶颈。

有关详细信息,请参阅this questionwikipedia

【讨论】:

    【解决方案2】:

    这只是语法糖。您可以将普通 int 声明为 int x;int x[1][1][1][1][1];。它不会影响内存布局,但是后一种形式使用起来很不方便,因为你只需要一个整数。

    同样,在处理应该表示二维的数据时,使用必须通过[i*YSIZE + j] 而不是[i][j] 访问的单个“错位”数组是不方便的。

    【讨论】:

      【解决方案3】:

      假设我必须将 10 个一维数组存储在一起。那你会怎么做呢?

      将它们合并成一个大数组?

      这是一种可能的解决方案! 但是不!还有什么更简洁易读的解决方案?制作这些一维数组的数组!不是吗?这给了我们一个二维数组。

      这就是多维数组的重要性,即使您可以访问所有类型数组中的值。

      我希望您现在还没有开始大量编码。因为一旦你开始编码,单维和多维的使用变得更加明显,而不是从阅读中收集知识。

      【讨论】:

      • 访问一维表示的矩阵中的值并不难。
      猜你喜欢
      • 1970-01-01
      • 2018-04-05
      • 2010-10-10
      • 2016-01-09
      • 1970-01-01
      • 2010-11-03
      相关资源
      最近更新 更多