好的,我有;
int grid_x = 5
int * grid;
grid = new int[grid_x];
*grid = 34;
cout << grid[0];
Run Code Online (Sandbox Code Playgroud)
第3行应该创建一个包含5个元素的数组吗?或者用数字5填充第一个元素?
第4行填充第一个元素,如何填写其余元素?
没有第4行,第5行读取"-842150451".
我不明白发生了什么,我正在尝试使用用户指定的x和y值创建二维数组,然后用用户指定的数值逐个填充每个元素.我上面的代码是尝试首先使用1维数组进行尝试.
Rei*_*ica 11
创建动态(可调整大小)数组的默认C++方法int是:
std::vector<int> grid;
Run Code Online (Sandbox Code Playgroud)
当标准库已经为您封装时,不要使用不安全的指针和手动动态分配.
要创建5个元素的向量,请执行以下操作:
std::vector<int> grid(5);
Run Code Online (Sandbox Code Playgroud)
然后,您可以使用[]以下方法访问其各个元
grid[0] = 34;
grid[1] = 42;
Run Code Online (Sandbox Code Playgroud)
您可以在后面添加新元素:
// grid.size() is 5
grid.push_back(-42);
// grid.size() now returns 6
Run Code Online (Sandbox Code Playgroud)
请参阅参考文档以查看所有可用的操作std::vector.
第3行应该创建一个包含5个元素的数组吗?
是.它不会初始化它们,这就是为什么你会看到一个奇怪的值.
或者用数字5填充第一个元素?
new int(grid_x),使用圆括号,将创建单个对象,而不是数组,并指定初始值.
无法分配数组new 并使用(非零)值初始化它们.您必须在分配后分配值.
第4行填充第一个元素,如何填写其余元素?
您可以使用下标运算符 []来访问元素:
grid[0] = 34; // Equivalent to: *(grid) = 34
grid[1] = 42; // Equivalent to: *(grid+1) = 42
// ...
grid[4] = 77; // That's the last one: 5 elements from 0 to 4.
Run Code Online (Sandbox Code Playgroud)
但是,你通常不想像这样处理原始指针; delete[]当你完成它时,必须使用数组的负担可能很难实现.而是使用标准库.这是制作二维网格的一种方法:
#include <vector>
std::vector<std::vector<int>> grid(grid_x, std::vector<int>(grid_y));
grid[x][y] = 42; // for any x is between 0 and grid_x-1, y between 0 and grid_y-1
Run Code Online (Sandbox Code Playgroud)
或者使用单个连续数组可能更有效; 你需要自己的小函数来访问它作为一个二维网格.这样的事情可能是一个很好的起点:
template <typename T>
class Grid {
public:
Grid(size_t x, size_t y) : size_x(x), size_y(y), v(x*y) {}
T & operator()(size_t x, size_t y) {return v[y*size_x + x];}
T const & operator()(size_t x, size_t y) const {return v[y*size_x + x];}
private:
size_t size_x, size_y;
std::vector<T> v;
};
Grid grid(grid_x,grid_y);
grid(x,y) = 42;
Run Code Online (Sandbox Code Playgroud)