繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM