如何声明将接受任何大小的2D向量参数?

时间:2019-08-04 13:43:55

标签: c++ dynamic-memory-allocation

我刚刚开始学习C ++。

我必须声明一个将接受此类变量的方法:

int grid1[200][200];
int grid2[20][25];
int grid3[53][40];

如何在方法中声明该参数?

我找到了这个声明,但是我不知道它是否有用或如何使用:

int** a = new int*[rowCount];

我将该参数复制到一个动态的成员变量中(我认为它将在堆中,因此这就是动态的原因)。

3 个答案:

答案 0 :(得分:4)

对于静态大小的数组,请使用std::array。对于动态调整大小的数组,请使用std::vector。除非有一些奇怪的情况强加给您,否则请不要使用原始C数组。

如果您需要多维数组,则当然可以为std::vector<std::vector<int>>使用std::array或类似的数组。这很容易且方便,因为您可以进行myarray[row][column](可能做得足够好了)。但是,性能更好的选择通常是只声明尺寸为“维度1 *维度2”的1D std::vector<int>,然后在对其进行索引时执行myvector[row_number * size_of_row + column]。将一维数组视为2D数组就这么简单,并且由于对CPU的预取器和缓存层次结构更友好,因此可能会表现更好。

至于声明一个函数来接受这样的数组-这很简单。例如:

void f(const std::array<int, 666>& myarray);
void f(const std::array<std::array<int, 42>, 666>& myarray);
void f(const std::vector<int>& myarray);
void f(const std::vector<std::vector<int>>& myarray);

答案 1 :(得分:2)

使用std::vector并忘记与普通数组有关的所有内容。

vector<int> x(100);
int(*yy)[3] = (int(*)[3])x.data(); // Creates a 2D array inside x
yy[0][1] = 5;
yy[1][2] = 4;
yy[2][2] = 10;

如果您关心注释中提到的caching,则可以创建一个一维向量并将其转换为多维数组,我之前曾问过here动态数组。或者,如果您的尺寸是静态的,则只需:

x*col + row

使用诸如normalize-space之类的行和列进行内部计算以将一维数组手动转换为2D不好并且容易出错。

答案 2 :(得分:-1)

我前几天发现的一个有趣的技巧是可以使用如下模板:

template <int x, int y>
void myFunc(int (grid&)[x][y]) {
    // implementation
}

这将允许您的函数接受任意大小的数组。

缺点是因为它是模板,所以必须放在标头(或程序中的某个地方)中,因此,如果它在API中,则会向用户公开。

当然,如果您不习惯使用数组,那么还有vectors vector选项(我认为其他人已经提到过):

void myFunc(std::vector<std::vector<int>> grid) {
    // implementation
}