如何在不知道维度的情况下在 C++ 中传递二维数组 [重复]

Posted

技术标签:

【中文标题】如何在不知道维度的情况下在 C++ 中传递二维数组 [重复]【英文标题】:How to pass a 2D array in C++ without knowing the dimensions [duplicate] 【发布时间】: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。) https://***.com/questions/1887097/why-arent-variable-length-arrays-part-of-the-c-standard 无论哪本 C++ 教科书给出了将 int m[][n] 作为函数参数传递的示例——这不是有效的 C++,因此您应该获得更好的 C++ 教科书并扔掉它。 【参考方案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 的顺序存储 - 常见的用法是在内循环中有列,在外循环中有行。

以上是关于如何在不知道维度的情况下在 C++ 中传递二维数组 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何在不使用渐变维度的情况下在维度中创建数据历史记录?

如何将 C# 中的二维数组传递给 C++ DLL?

如何在不传递引用的情况下在 Python 中使用 SyncManager 跨进程共享列表

如何在不引用 React 中的动态值的情况下在 URL 中传递“:”?

如何在不使用向量的情况下将数组传递给函数?

如何在不使用 segue 的情况下在视图控制器之间传递图像