如何声明一个接受任何大小的 2D 矢量参数?
How to declare a 2D vector parameter which will accept any size?
我刚刚开始学习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 是不好的且容易出错。
相关文章:
- 具有可变大小作为参数的 2D 数组C++
- 我怎么能有一个以2D数组为参数的函数,而数组有一个我想更改的参数/维度
- 我正在为2D阵列参数而挣扎
- 将 2D 数组作为函数参数,并返回 2D 数组作为函数的返回类型
- 如何声明一个接受任何大小的 2D 矢量参数?
- 如何正确传递 2D 数组指针作为参数
- 如何将数组 2d 作为参数从函数传递并返回数组 2d 此函数
- 使用来自C 参数的大小创建2D数组
- C++ 默认参数的重新定义:参数 1 (矢量 2D)
- 具有参数化构造器的2D矢量
- 从 2D 数组中获取前一个数组,其中给定数组作为函数中的参数传递
- 将2D数组作为函数参数传递,其维度仅在运行时已知
- 如何使用函数参数中的int指针来获取2d数组中最大值的索引并返回指针
- C 试图使用函数参数定义2D数组
- 传递具有可变维度的 2D 数组作为函数参数
- 使用 2D 数组作为递归函数中的参数
- 2D 数组作为函数的参数
- 使用形状参数时,如何灵活地使用可以处理 2D 和 3D 形状的方法参数
- 在C++中将 2d 数组作为函数参数传递时出错
- c++错误c2440使用带有2d参数的构造函数