C ++-将静态2D数组传递给函数

时间:2018-11-22 20:38:05

标签: c++

我应该如何将静态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行和列的数组。而且,我想使用函数,因为它将使我的代码可读。有什么解决方案可以满足我的期望吗?

3 个答案:

答案 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>。无需混用非标准阵列。