Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;,如何生成长度不限于整数的数组? 目前,C++只允许声明长度为整数的数组。有什么办法绕过它吗?我正试图创建一个程序来生成一个数组,该数组的长度可能会达到数千甚至数百万,这取决于输入,但数组声明限制为仅限整数长度却让我望而却步_C++_Arrays - Fatal编程技术网

C++;,如何生成长度不限于整数的数组? 目前,C++只允许声明长度为整数的数组。有什么办法绕过它吗?我正试图创建一个程序来生成一个数组,该数组的长度可能会达到数千甚至数百万,这取决于输入,但数组声明限制为仅限整数长度却让我望而却步

C++;,如何生成长度不限于整数的数组? 目前,C++只允许声明长度为整数的数组。有什么办法绕过它吗?我正试图创建一个程序来生成一个数组,该数组的长度可能会达到数千甚至数百万,这取决于输入,但数组声明限制为仅限整数长度却让我望而却步,c++,arrays,C++,Arrays,基本上,假设我想要创建一个包含5行和500000列的2d数组,我会遇到一个分段错误。std::array的原型是 template<class T, std::size_t N> struct array; 模板结构数组; 根据, std::size\t可以存储理论上可能的 任何类型的对象(包括数组)大小不能为的类型 由std::size\t表示的格式错误(从C++14开始) (强调矿山) 从定义上看,不能表达一个对象的概念,该对象的大小大于代码>: 幸运的是,在大多数平台上,s

基本上,假设我想要创建一个包含5行和500000列的2d数组,我会遇到一个分段错误。

std::array的原型是

template<class T, std::size_t N> struct array;
模板结构数组;
根据,

std::size\t
可以存储理论上可能的 任何类型的对象(包括数组)大小不能为的类型 由
std::size\t
表示的格式错误(从C++14开始)

(强调矿山)

从定义上看,不能表达一个对象的概念,该对象的大小大于<>代码>: 幸运的是,在大多数平台上,
std::size\u t
的最小值将为32位,这意味着它不仅可以达到数百万位,还可以达到数十亿位。如果你在一个平台上,它比这个平台小,那么你的硬件在物理上可能无法存储更大的对象


更新:在您添加的评论中

对不起,我应该说得更具体些。基本上,假设我 如果要创建一个包含5行和500000列的二维数组,我会得到一个 分段错误

如果这里的问题是语言的限制,那么您将得到一个编译器错误,而不是运行时错误

由于出现运行时错误,问题出在您的平台上,而不是语言上。在这种特殊情况下,“问题”在于它没有给您足够的堆栈空间来支持堆栈帧中的多兆字节对象。(如果你问我,这是一个非常合理的限制。)相反,你需要在堆上分配数据

我可以给您一些代码,让您的问题暂时消失,但您真正需要做的是阅读有关堆栈和堆的内容,了解它们是什么以及如何使用它们。

\include
#include <iostream>

int main() {
    int n = 0;
    std::cin >> n;
    int *arr = new int[n]; // dynamic declaration of variable length array
    for(int i = 0; i < n; ++i)
        std::cin >> arr[i]; // read array elements
    return 0;
}
int main(){ int n=0; 标准:cin>>n; int*arr=new int[n];//可变长度数组的动态声明 对于(int i=0;i>arr[i];//读取数组元素 返回0; }
编辑:用于二维阵列

#include <iostream>

int main() {
    int **arr;
    int r, c;
    std::cin >> r >> c;

    // Create an array of row heads
    arr = new int *[r];

    // Create an 2d array
    for (int i = 0; i < r; ++i) arr[i] = new int[c];

    // read input in 2d array
    for (int i = 0; i < r; ++i)
        for (int j = 0; j < c; ++j) std::cin >> arr[i][j];

    // print 2d array
    for (int i = 0; i < r; ++i)
        for (int j = 0; j < c; ++j) std::cout << arr[i][j] << ' ';
    return 0;
}
#包括
int main(){
int**arr;
int r,c;
标准:cin>>r>>c;
//创建一个行标题数组
arr=新整数*[r];
//创建二维阵列
对于(int i=0;i>arr[i][j];
//打印二维阵列
对于(int i=0;i对于(int j=0;jstd::vector
是一个更好的选择。您只需
推回
放置回
即可向其中添加元素

更多详情:

你为什么认为“整数”会限制你拥有数百万的长度吗?你的意思是你想要一个大于
int
的数组大小吗?最好澄清一下,因为整数可以像你想要的那样大。@RemyLebeau我试图指出整数是无限的,而约束是系统的物理限制。@Alexelio官方肯定会发生这种情况如果你想把这个巨大的数组放在自动内存中,比如堆栈。使用动态内存,那么它就可以正常工作。除非你的数组元素特别大,否则数组中有2.5米的元素(无论是1D还是2D)如果可用内存足够,则在32位系统上很容易实现。实际上,最好使用动态分配的内存(例如,一个由五个
std::vector
组成的数组,每个数组可以动态调整大小为500000个元素).然而,还有一个设计问题-人们想要大型阵列的最常见原因是他们默认拥有所有“东西”在记忆中——现实地,通常是可以避免的。谢谢解释这个问题,而不是仅仅显示工作代码。这不是一个好的答案。首先,你应该添加一些解释而不是仅仅显示代码。第二,这不是一个好的C++实践(甚至你不删除)。。向量向量会更好。或者,如果效率很重要的话,我总是将2D数组元素以某种顺序(行、列、Z-Morton等)存储在一维数组中,并可能使用具有元素访问器的类将其包装。