我应该如何将静态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行和列的数组。而且,我想使用函数,因为它将使我的代码可读。有什么解决方案可以满足我的期望吗?
答案 0 :(得分:4)
使用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;
}
答案 1 :(得分:2)
经典的C ++解决方案将涉及使用向量的向量。如果不合适(因为您想提高速度或对内存进行更多控制),则可以为正方形二维数组定义自己的类。
我在代码中使用的一个想法是,使用基础的1-D 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*
而不是{{1 }},放在vector<int>
中。
答案 2 :(得分:1)
只需使用vector<>
中的vector<int>
。无需混用非标准阵列。