所以我在自学C ++,并对数组有疑问。我知道如果我声明2D数组,例如:
char board[8][8];
我创建了一个高度和宽度为8的2D数组。但是,我想知道是否有一种方法可以将这些尺寸设置为变量,以便用户可以输入所需的高度和宽度,我在C ++中尝试过视觉工作室不高兴。
int rowSize = 0;
int colSize = 0;
cin >> rowSize >> colSize;
char board[rowSize][colSize];
有人可以帮助我吗?
答案 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作为该语言的文档扩展...