【问题标题】:Passing Multidimensional array with variable size传递可变大小的多维数组
【发布时间】:2021-10-31 03:47:42
【问题描述】:

将数组的维度传递给函数,但仍然出错!

代码(您可以直接向下滚动到它给出的错误并仅查看代码中的那些行)

class Solution {
    public:
    int mod = 1e9 + 7;
    int checkRecord(int n) {
        int dp[n + 1][2][3];
        memset(dp, -1, sizeof(dp));
        return helper(0, 1, 2, n + 1, 2, 3, dp);
    }
    int helper(int idx, int A, int startL, int N, int M, int K, int dp[N][M][K]) {
        if(idx == N) return;
    
        if(dp[idx][A][startL] != -1) {
            return dp[idx][A][startL];
        }
        
        dp[idx][A][startL] = helper(idx + 1, A, 2, N, M, K, dp) % mod;
        
        if(startL > 0) {
            dp[idx][A][startL] += helper(idx + 1, A, startL - 1, N, M, K, dp) % mod;
        }
        return dp[idx][A][startL];
    }
};

错误

 error: cannot initialize a parameter of type 'int (*)[*][*]' with an lvalue of type 'int [n + 1][2][3]'
        return helper(0, 1, 2, n + 1, 2, 3, dp);
                                            ^~
 note: passing argument to parameter 'dp' here
    int helper(int idx, int A, int startL, int N, int M, int K, int dp[][M][K]) {
                                                                    ^

【问题讨论】:

标签: c++ arrays multidimensional-array


【解决方案1】:
int checkRecord(int n) {
    int dp[n + 1][2][3];

数组变量的大小在 C++ 中必须是编译时常量。 n + 1 不是编译时间常数,因此程序格式错误。

如果要创建具有运行时大小的数组,则必须创建具有动态存储持续时间的数组。最简单的方法是使用std::vector

int helper(int idx, int A, int startL, int N, int M, int K, int dp[N][M][K]) {

同样适用于也是变量的参数。尽管存在细微差别,因为数组参数将被调整为指向数组第一个元素的指针,并且数组的最外层维度,即 N 被忽略。如果MK 是编译时间常数,则dp 的类型将是int(*)[M][K]

是的,但是 3d 矢量太多了,无法输入vector<vector<..

为了编写长类模板实例,您应该调整自己的节奏,以免在结束前筋疲力尽。如果您因疲劳而感到沮丧,请稍作休息以恢复并稍后继续。我相信你可以做到的。

也就是说,您的数组的内部维度似乎是恒定的,因此您不需要在向量中使用向量。

if(idx == N) return;

这是非 void 函数中格式错误的 return 语句。

【讨论】:

  • 谢谢!“也就是说,你的数组的内部维度似乎是恒定的,所以你不需要在向量中使用向量。”请您详细说明一下!
  • 如果有兴趣,最后我使用this工作代码
【解决方案2】:

您似乎正在尝试解决竞争性编程问题。所以我的回答将集中在这一点上。我认为其他人指出了为什么它不是有效的 C++。

在 C++ 中,我没有看到任何简单的方法来实现你想要的。

在实践中,当涉及到竞争性编程问题时,您可以只定义一个大的全局数组(因为问题通常具有固定的输入大小。在这种情况下,会有 N、M 和 K 的最大数量)和你不必为通过它而挣扎。为每种情况重复使用数组,但请确保每次都对其进行初始化。是的,这通常不是一个好的做法,但对于竞争性编程来说非常方便。

如果您认为 3D 矢量是多余的,您可以考虑这个。

【讨论】:

  • 可以,但在面试环境中,这样做是有害的!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-26
相关资源
最近更新 更多