C ++中具有可变尺寸的2D数组

时间:2018-10-08 13:57:31

标签: c++ arrays multidimensional-array

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

char board[8][8];

我创建了一个高度和宽度为8的2D数组。但是,我想知道是否有一种方法可以将这些尺寸设置为变量,以便用户可以输入所需的高度和宽度,我在C ++中尝试过视觉工作室不高兴。

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

有人可以帮助我吗?

4 个答案:

答案 0 :(得分:1)

由于此标签标记有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 here的文档。

答案 1 :(得分:0)

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

另一种结构不兼容c ++,它是C99(可变长度数组)的gcc扩展,它们的等效项(或多或少)是向量或指向数组的唯一指针。

答案 2 :(得分:0)

如果您真的想这样做,可以按照以下步骤进行:

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.

尽管我强烈建议您改用vector

答案 3 :(得分:0)

不,您不能使用兼容的C ++,因为该标准未定义可变长度数组(*)。

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

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

如果您可以接受函数类型的访问,则可以使用大小为64(8 * 8)的基础一维向量以及返回引用的访问器方法来构建自定义容器。

如果您想用基本的真实2D数组模拟2D容器,那么您会遇到麻烦。我试图构建一个通用的多维容器(Code Review中的代码),并意识到您无法在非标准容器上正确实现随机访问迭代器...


(*),当然,gcc很高兴接受C ++中的VLA作为该语言的文档扩展...