在进入main函数之前进行输入



我试图在全局范围内声明一个二维数组,其中行数和列数留给用户输入。我已经试了一个小时了,但是找不到任何方法。帮助我。

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

相关内容

  • 没有找到相关文章

最新更新