如何在不知道尺寸的情况下在C ++中传递2D数组

问题描述

#include<iostream>
using namespace std;

int n;

int diagonal(int m[][n]){
    int r = 0,l = 0;
    for(int i=0;i<n;i++){
        l += m[i][i];
        r += m[n-i][i];
    }
    if(r>l) return r - l;
    else return l - r;
}

int main(){
    cin >> n;
    int a[n][n];
    for(int i=0;i<n;i++) for(int j=0;j<n;j++) cin >> a[i][j];
    cout << diagonal(a) << endl;
    return 0;
}

我不知道为什么在代码上面运行会出错。

错误1:数组绑定不是']'令牌之前的整数常量,如果我从用户那里获取常量值,我应该如何传递它。

错误2:在此范围内未声明'n' 6 | for(int i = 0; i ,对此一无所知。

解决方法

Error No.1: array bound is not an integer constant before ']' token, 如果我从用户那里获取常数值,我应该如何传递它。

不能。当您要使用可变长度数组时,通常应将其替换为std::vector

示例:

#include <cstdlib>
#include <iostream>
#include <vector>

int diagonal(const std::vector<std::vector<int>>& m) {
    int r = 0,l = 0;

    for(size_t i = 0; i < m.size(); ++i) {
        l += m[i][i];
        // r += m[n - i][i]; //  m[n][0]` when `i == 0`.
        r += m[m.size() - i - 1][i];
    }

    // this is most likely implemented without branching:
    return std::abs(r - l);
}

int main() {
    // use an unsigned type suitable for indexing like size_t
    if(size_t n; std::cin >> n) {

        // int a[n][n];               // not valid C++

        // vector replacement:
        std::vector<std::vector<int>> a(n,std::vector<int>(n));

        for(size_t i = 0; i < n; i++) {
            for(size_t j = 0; j < n; j++) {
                std::cin >> a[i][j];
            }
        }
        std::cout << diagonal(a) << '\n';
    }
}
,

使用模板:

template<auto X,auto Y>
int diagonal(int (&m)[X][Y]){