在进入主函数之前获取输入
Take input before entering main function
我正在尝试全局声明一个二维数组,其中的行数和列数留给用户输入。我正在尝试过去一个小时,但找不到任何解决方法。帮帮我。
#include<iostream>
using namesapce std;
int m,n,array[m][n];
int main()
{
cin>>m>>n;
.
.
.
}
而且我想以某种方式将变量 m & n 的输入值反映到我原来的 array.How 中?
而且在实现上面的代码时它给出了 "Error Bound Is not an Integer Constant"
的错误
谢谢
让我们将这个全局定义为 int** 数组,然后在 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;
}
为了静态分配多维数组,必须在编译时知道维度。
由于直到运行时才知道您的维度,因此您需要使用动态内存分配。
在 C++ 中有多种动态分配多维数组的方法,我认为其中 none 是完全令人满意的。由于这是一个 C++ 问题,我将重点关注 C++ 答案,而不是 C,并尽可能使用 RAII 类型和标准库容器。
Boost.Multi-数组
我认为最好的选择是使用 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++ 中实现动态多维数组的最简单方法是使用向量的向量:
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;
这应该是相对有效的,但需要一些额外的设置。您还失去了标准库容器在内部维度上的优势。
我正在尝试全局声明一个二维数组,其中的行数和列数留给用户输入。我正在尝试过去一个小时,但找不到任何解决方法。帮帮我。
#include<iostream>
using namesapce std;
int m,n,array[m][n];
int main()
{
cin>>m>>n;
.
.
.
}
而且我想以某种方式将变量 m & n 的输入值反映到我原来的 array.How 中? 而且在实现上面的代码时它给出了 "Error Bound Is not an Integer Constant"
的错误谢谢
让我们将这个全局定义为 int** 数组,然后在 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;
}
为了静态分配多维数组,必须在编译时知道维度。
由于直到运行时才知道您的维度,因此您需要使用动态内存分配。
在 C++ 中有多种动态分配多维数组的方法,我认为其中 none 是完全令人满意的。由于这是一个 C++ 问题,我将重点关注 C++ 答案,而不是 C,并尽可能使用 RAII 类型和标准库容器。
Boost.Multi-数组
我认为最好的选择是使用 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++ 中实现动态多维数组的最简单方法是使用向量的向量:
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;
这应该是相对有效的,但需要一些额外的设置。您还失去了标准库容器在内部维度上的优势。