我不明白如何在C++中创建和使用动态数组

mrm*_*ike 4 c++ arrays

好的,我有;

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.


Mik*_*our 9

第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)