固定大小的原始数组矩阵(即 2D 原始数组)
// A fixed size raw array matrix (that is, a 2D raw array).
#include <iostream>
#include <iomanip>
using namespace std;
auto `main()` -> int
{
int const n_rows = 3;
int const n_cols = 7;
int const m[n_rows][n_cols] = // A raw array matrix.
{
{ 1, 2, 3, 4, 5, 6, 7 },
{ 8, 9, 10, 11, 12, 13, 14 },
{ 15, 16, 17, 18, 19, 20, 21 }
};
for( int y = 0; y < n_rows; ++y )
{
for( int x = 0; x < n_cols; ++x )
{
cout << setw( 4 ) << m[y][x]; // Note: do NOT use m[y,x]!
}
cout << '\n';
}
}
输出:
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
C++不支持索引多维数组的特殊语法。相反,这样的数组被视为一个数组数组(可能是数组,依此类推),并且普通的单个索引符号 [
i
]
用于每个级别。在上面的示例中,m[y]
指的是 m
的行 y
,其中 y
是从零开始的索引。然后可以依次索引这一行,例如 m[y][x]
,它指的是行 y
的 第 9 项 - 或列。
即最后一个索引变化最快,并且在声明中,此索引的范围(此处是每行的列数)是指定的最后一个和最内部大小。
由于 C++不提供动态大小数组的内置支持,除动态分配外,动态大小矩阵通常作为类实现。然后原始数组矩阵索引符号 m[y][x]
有一些成本,要么通过暴露实现(以便例如转换矩阵的视图实际上变得不可能),要么通过从 operator[]
返回代理对象来增加一些开销和轻微不便。因此,这种抽象的索引符号通常会在外观和索引的顺序上不同,例如 m(x,y)
或 m.at(x,y)
或 m.item(x,y)
。