【问题标题】:C++ - passing static 2d array to functionsC++ - 将静态二维数组传递给函数
【发布时间】:2018-11-22 20:38:04
【问题描述】:

我应该如何将静态二维数组作为参数传递给 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 行和列的数组。此外,我想使用函数,因为它会使我的代码可读。这个问题有什么解决方案可以满足我的期望吗?

【问题讨论】:

  • 这甚至不适用于“一维数组”。 C++ 不支持变长数组。
  • 为什么不用双指针int **tab
  • 因为向量对我的需要来说太慢了。 – 太慢了,不适合什么?
  • @ventaquil "双指针" - 你为什么要这样做?保持代码简单 - 更多的星通常表示更差的代码,而不是更好的代码。现代 C++ 有容器、智能指针等,您可以使用它们来避免使用低级的东西并保持正常(并且抽象通常会优化掉)。
  • @Mentos1105 呵呵!使用大小为rows * columnsone 向量并计算像(row * columns + col) 这样的索引。如果您知道接下来 n 次访问将保持在同一行,请缓存索引并进行添加。要查找的术语:缓存位置。

标签: c++


【解决方案1】:

使用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;
}

【讨论】:

  • 是的,但是我的数组的大小是基于我的代码之前读取的文件中的数据。因此,为了避免任何缓慢的动态数据类型,我需要声明巨大的二维数组并只处理其中的一部分?
  • 即使这是不可能的,因为foo 将始终在编译时间常数维度N 上工作。除了维度数组[N][N] 之外,您不能向其传递任何内容。动态维度意味着动态分配的数组。
  • 是的,我的意思是在函数体中我将只使用数组中需要的部分。
【解决方案2】:

经典的 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&lt;int&gt;存储在@987654328中@。

【讨论】:

    【解决方案3】:

    只需使用vector&lt;&gt;vector&lt;int&gt;。不需要乱搞非标准数组。

    【讨论】:

    • 我在帖子中说过,向量对我的需求来说太慢了。
    • @Mentos1105 太慢了怎么办?这是一个奇怪的说法。向量尽可能快地获得动态大小的数组
    • @Mentos1105 然后使用单个向量并将其视为2D事物。
    • 你量过吗?如果不先做一些工作来验证向量是否确实更慢(这将是非常令人惊讶的......),你不能做出像这样的广泛的全面陈述。编写干净的代码 - 让编译器完成它的工作。
    • 完全优化?当您说静态数组时-您是指静态大小的数组(编译时)还是动态分配的数组?而“细节”将决定你是否得到一个高质量的答案或其他东西——请记住这一点,以备不时之需......
    猜你喜欢
    • 1970-01-01
    • 2021-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多