具有可变尺寸的 C++ 2D 阵列

2D array in C++ with variable dimentions

本文关键字:C++ 2D 阵列      更新时间:2023-10-16

所以我在自学C++,我对数组有疑问。我知道如果我声明一个 2D 数组,例如:

char board[8][8];

我创建了一个高度和宽度为 8 的 2D 数组。但是,我想知道是否有办法将这些维度设置为变量,以便用户可以输入他们想要的高度和宽度,我在C++尝试过这个,视觉工作室并不满意。

int rowSize = 0;  
int colSize = 0;
cin >> rowSize >> colSize;
char board[rowSize][colSize];

谁能帮我?

由于这被标记为c++,也许std::vector适合您。它很像一个数组,但更方便,非常适合此目的。您可以使用此初始值设定项调用简单地初始化嵌套向量的 2D 数组(感谢 Bob__ 提供这个更简单的解决方案(:

int n = 5;
int m = 10;
std::vector<std::vector<char>> board (n, std::vector<char>(m, 'a'));

这将创建板并初始化所有字段以'a',每个示例。您可以使用与 C 样式数组相同的语法访问和操作数据:

char x = board[4][2];
board[3][3] = 'o';

最后但并非最不重要的一点是,有许多方便的特性和功能允许您比使用 C 样式数组更轻松地执行复制它之类的操作。在此处查看std::string的文档。

如果要分配此类矩阵,请使用向量并使用i + j * rowSize对其进行索引。

另一种结构不符合 c++,它是 C99(可变长度数组(的 gcc 扩展,它们的等价物(或多或少(是向量或指向数组的唯一指针。

如果你真的想这样做,你可以做以下事情:

int* myPointer = nullptr;   // Pointer to int, initialize to nothing.
int sizeOfArray;           // Size needed for array
std::cin >> sizeOfArray;        // At runtime get the size of the array
myPointer = new int[sizeOfArray];  // Allocate array of specified size and save ptr in a.
for (int i = 0; i < sizeOfArray; i++) {
myPointer[i] = 0;    // Initialize all elements to zero.
}
delete[] myPointer;  // When done, free memory pointed to by myPointer.
myPointer = nullptr;     // Clear a to prevent using invalid memory reference.

尽管我强烈建议您使用矢量。

不,您不能在一致性C++中,因为标准没有定义可变长度数组 (*(。

如果不需要连续分配(真正的 2D 数组底层存储(,则可以使用向量向量。这通常是最简单和最惯用的方式:

std::vector<std::vector<char>>(8, std::vector<char>(8, ''));

如果可以接受函数类型访问,则可以使用大小为 64 (8*8( 的基础 1D 向量和返回引用的访问器方法生成自定义容器。

如果你想用底层的真正2D数组来模仿2D容器,那么你就有麻烦了。我尝试构建一个通用的多维容器(代码审查中的代码(,并意识到您无法在非标准容器上正确实现随机访问迭代器......


(*( 当然,GCC 很乐意接受 VLA 在 C++ 作为该语言的书面扩展......