如何在不知道维度的情况下在 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<std::vector<int>>
,并提供.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::vector
s。
例子:
#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 (&m)[Y][X]
,但您仍然需要处理int a[n][n];
才能使用该功能。
为什么你更喜欢 Y 而不是 X?
因为多维数组在 C++ 中以row-major 的顺序存储 - 常见的用法是在内循环中有列,在外循环中有行。以上是关于如何在不知道维度的情况下在 C++ 中传递二维数组 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
如何在不传递引用的情况下在 Python 中使用 SyncManager 跨进程共享列表