【问题标题】:How to pass a 2D array in C++ without knowing the dimensions [duplicate]如何在不知道维度的情况下在 C++ 中传递二维数组 [重复]
【发布时间】:2020-12-09 17:33:05
【问题描述】:
#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,不知道这个。

【问题讨论】:

  • 运行时可以切换到std::vector&lt;std::vector&lt;int&gt;&gt;,并提供.size()方法查询元素个数
  • int a[n][n]; 是无效的 C++(使用 VLA 扩展)。
  • 如果必须使用数组,为什么不将n 作为单独的参数传递呢? (另外,你没有在main 中声明n。)
  • 无论哪本 C++ 教科书给出了将 int m[][n] 作为函数参数传递的示例——这不是有效的 C++,因此您应该获得更好的 C++ 教科书并扔掉它。

标签: c++ multidimensional-array c++14


【解决方案1】:

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

你不能。当你想使用变长数组时,通常应该将它们替换为std::vectors。

例子:

#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';
    }
}

【讨论】:

    【解决方案2】:

    使用模板:

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

    【讨论】:

    • 我会说const int (&amp;m)[Y][X],但您仍然需要处理int a[n][n]; 才能使用该功能。
    • 为什么你更喜欢 Y 而不是 X?
    • 因为多维数组在 C++ 中以row-major 的顺序存储 - 常见的用法是在内循环中有列,在外循环中有行。
    猜你喜欢
    • 2018-03-26
    • 2019-04-14
    • 2020-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-16
    • 2016-05-12
    • 1970-01-01
    相关资源
    最近更新 更多