如何声明一个接受任何大小的 2D 矢量参数?

How to declare a 2D vector parameter which will accept any size?

本文关键字:2D 参数 任何大 声明 何声明 一个      更新时间:2023-10-16

我刚刚开始学习C++。

我必须声明一个接受以下变量的方法:

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

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

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

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

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

对于静态大小的数组,请使用 std::array。对于动态大小的数组,请使用 std::vector。永远不要使用原始 C 数组,除非某些奇怪的情况迫使你这样做。

如果你需要一个多维数组,你当然可以使用std::vector<std::vector<int>>或类似的std::array。这既简单又方便,因为您可以做myarray[row][column](并且可能足够好)。但性能更好的选择通常是只声明大小为"维度 1 * 维度 2"的一维std::vector<int>,然后在索引到它时,执行myvector[row_number * size_of_row + column]。将 1D 数组视为 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);

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

void foo(vector<vector<int>>& v)
{
...
}

// now you have a 100x50 double array
vector<vector<int>> x;
x.resize(100);
for(auto& xx : x)
{
xx.resize(50);
}
foo(v);

如果您关心评论中提到的缓存,您可以创建一个单维向量并将其转换为多维数组,我之前在这里问过动态数组。或者,如果您的尺寸是静态的,您可以简单地:

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;

使用行和列(如x*col + row)进行内部计算以手动将单维数组转换为 2D 是不好的且容易出错。