【问题标题】:Handling multi-dimensional array lengths in C++在 C++ 中处理多维数组长度
【发布时间】:2011-12-13 10:13:21
【问题描述】:

我想构建一个函数,它接受一个多维数组并像网格一样打印它。我遇到了麻烦,因为 c++ 不允许函数具有多维数组参数,除非您指定它的长度。这里有一个关于它的问题,使用向量回答了。我还没有学会如何使用向量,所以请不要在答案中使用它们,或者如果你这样做的话,至少提供一个很好的教程。

无论如何,我想知道是否可以在 c++ 中返回一个数组...我开始使用 javascript 编程,所以我想到的第一个解决方案是做类似的事情

int gen(int len){
    return int arr(int a[][len]){
        cout << a[0][0];
    };
}

我知道这行不通,我试过了,当它不起作用时我并不感到惊讶。有没有办法做这样的事情?

【问题讨论】:

  • 这需要你一个小时的阅读和一个小时的实验来学习如何使用向量。或者,您可以花很多时间编写自己的类来处理所有未构建原生数组的细节。我认为,如果最好的解决方案是您尚未学习的解决方案,那么最好花时间学习它。 cplusplus.com/reference/stl/vectoryolinux.com/TUTORIALS/LinuxTutorialC++STL.html 数组很有用,但有更强大的工具可用,通常最好利用它的力量,除非你有充分的理由不这样做。
  • @DavidO STL 向量虽然不支持多维数组......(vector > 并不真正计数,因为它仍然是一个一维数组,只是具有一个项目类型也是一个 1D 数组;特别是它不像请求的 2D 网格,除非您自己手动调整所有 vector 的大小)
  • @DavidO 感谢您提供指向 yolinux 教程的链接;)

标签: c++ arrays multidimensional-array return return-value


【解决方案1】:

在 C++ 中,您可以通过引用传递数组。通过将数组设为template,可以在函数中接收任意长度。例如,

template<size_t SIZE1>
void print (int (&arr)[SIZE1])
{ ... }

template<size_t SIZE1, size_t SIZE2>
void print (int (&arr)[SIZE1][SIZE2])
{ ... }

template<size_t SIZE1, size_t SIZE2, size_t SIZE3>
void print (int (&arr)[SIZE1][SIZE2][SIZE3])
{ ... }

此模式将在内部为每个不同大小的数组创建一个独特的函数。它提供了易用性,但可能会增加代码大小。

【讨论】:

  • 模板几乎可以使用任何编译时值。为此,模板必须对值使用数字常量,您不能使用在运行时确定的值。如果您声明定长数组并将它们传递给模板函数,编译器通常可以为您计算出所需的模板值。
【解决方案2】:

你必须知道数组的大小,没有办法绕过它。 std::vector是解决这个问题的正确方法,你可以找到一个很好的参考here。这允许只传递向量,因为它知道自己的长度并且函数可以询问它,使其类似于您在 Javascript 中习惯的。

否则,您必须以一种或另一种方式将数组的大小传递给函数。

一种方法是使用模板,但这不适用于动态数组(而且有点浪费,因为它会为每个使用的数组大小创建一个函数副本)。另一种只是在函数中添加一个额外的参数,带有大小。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-26
    • 1970-01-01
    • 1970-01-01
    • 2023-02-25
    • 1970-01-01
    相关资源
    最近更新 更多