我试图在全局范围内声明一个二维数组,其中行数和列数留给用户输入。我已经试了一个小时了,但是找不到任何方法。帮助我。
#include<iostream>
using namesapce std;
int m,n,array[m][n];
int main()
{
cin>>m>>n;
.
.
.
}
不知何故,我想反映我的变量m &n到我的原始数组。怎么办?同时,在实现上述代码它给出错误的"错误界限不是一个整数常数"
谢谢
为了静态地分配多维数组,维数必须在编译时已知。
由于维度直到运行时才知道,因此需要使用动态内存分配。
在c++中有许多动态分配多维数组的方法,在我看来,没有一种是完全令人满意的。由于这是一个c++问题,我将把重点放在c++答案上,而不是C,并尽可能使用RAII类型和标准库容器。提振。Multi-Array
我认为最好的选择是使用boost库中的multi_array:
#include <iostream>
#include "boost/multi_array.hpp"
int main() {
int m;
int n;
std::cin >> m >> n;
boost::multi_array<int, 2> array(boost::extents[m][n]);
}
boost::multi_array就是为此目的而设计的,它高效、强大,提供了传统的C多维数组语法,但是你确实需要使用第三方库。
向量的向量
在标准c++中实现动态多维数组最简单的方法是使用vector of vector:
std::vector<std::vector<int>> array(m, std::vector<int>(n));
这也有传统的C多维数组语法,但它可能不是很有效。std::vector
将为每个内部数组进行分配,这可能会增加大量开销,并可能提供较差的数据局部性。
一个选项是根本不使用多维数组,而是分配一个连续的数组:
std::vector<int> array(m*n);
array[13+n*21] = 7;
但是你需要转换为单个索引来访问元素。
单向量和指针数组
另一种选择是分配一个向量来连续存储数据,然后分配第二个指针向量来提供多维数组语法。
std::vector<int> array_data(n*m);
std::vector<int*> array(n);
for (int i = 0; i != n; ++i)
array[i] = array_data.data() + m*i;
这应该是相对有效的,但需要一些额外的设置。在内部维度上,您还失去了标准库容器的好处。
让我们将这个全局变量定义为int** array,然后在main函数中动态地为数组分配内存。
#include <iostream>
using namespace std;
int** array;
int main()
{
int xSize;
int ySize;
cin >> xSize;
cin >> ySize;
int** array = new int*[xSize];
for(int i = 0; i < xSize; ++i)
{
array[i] = new int[ySize];
}
return 0;
}