[英]C++ - passing static 2d array to functions
我应该如何将静态2d数组传递给cpp中的参数? 我尝试过这样的事情:
void foo(int (&tab)[N][N]) {
// function body
}
int main() {
int n;
cin >> n;
int tab[n][n];
foo(tab); // doesn't work
return 0;
}
尝试调用foo时,出现“无匹配函数错误”。
我需要静态数组,因为矢量对于我的需求而言太慢了。 我也想避免声明具有10000行和列的数组。 而且,我想使用函数,因为它将使我的代码可读。 有什么解决方案可以满足我的期望吗?
使用cin >> n;int tab[n][n];
,则声明一个可变长度数组(即,其尺寸不是编译时常数的数组)。 这里有两个问题:首先,标准C ++不支持它们,其次,它们与您介绍的固定大小的数组参数不兼容。 但是,如果使用编译时已知的大小声明数组,则它将起作用:
#define N 10
void foo(int (&tab)[N][N]) {
cout << tab[1][1] << endl;
}
int main() {
int tab[N][N] = {};
tab[1][1]=15;
foo(tab);
return 0;
}
经典的C ++解决方案将涉及使用向量的向量。 如果不合适(因为您需要更快的速度或对内存的更多控制),则可以为正方形二维数组定义自己的类。
我在代码中使用的一个想法是,使用底层的一维vector
实现该目标,并使用访问器方法返回一个指针。
struct My_2D_Array
{
explicit My_2D_Array(size_t n):
m_size(n),
m_data(n * n)
{
}
int* operator[](size_t i)
{
return m_data.data() + i * m_size;
}
size_t m_size;
std::vector<int> m_data;
};
这不仅缺少所有的健全性检查,而且使绑定检查的访问成为不可能(因为访问器返回了裸指针),而且将作为一种快速而又肮脏的解决方案。
在代码中的用法:
int foo(My_2D_Array& matrix)
{
// example
return matrix[2][3] + matrix[3][2];
}
int main()
{
int n;
cin >> n;
My_2D_Array tab(n);
foo(tab);
return 0;
}
这个想法是高度可定制的-您可以根据需要使My_2D_Array
的代码简单或聪明。 例如,如果您仍然不喜欢使用vector
,即使它是一维的,您也可以单独管理(分配/取消分配)内存,并将int*
而不是vector<int>
在My_2D_Array
。
只使用一个vector<>
的vector<int>
。 无需混用非标准阵列。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.