大家好
我正在尝试使用C ++在VS 2010中创建一个非常大的数组。
当我尝试创建如下所示的数组时
int dp[4501][4501]
or
int dp[1000][1000]
它抛出异常“Stack Overflow” 然后我将其更改为:
int dp[100][100]
一切都很好。
因此,如果我想创建一个像上面这样的大数组,我该怎么办?
最诚挚的问候,
答案 0 :(得分:9)
使用动态分配或STL。最近有一个关于一个非常相似问题的帖子。请参阅this。
答案 1 :(得分:6)
答案 2 :(得分:5)
您应该使用动态分配:
typedef std::vector<int> int_vector;
int_vector dp(10000);
可以通过嵌套数组来模拟双数组:
typedef std::vector<int_vector> int_double_vector;
int_double_vector dp(4501, int_vector(4501));
答案 3 :(得分:1)
来自Parashift faq的文字:Why should I use container classes rather than simple arrays?
编辑:
看看stackoverflow线程:
When would you use an array rather than a vector/string? Why use iterators instead of array indices?
答案 4 :(得分:1)
您的堆栈溢出了太多位。你必须把它们排干。最好是堆在其他位上。我建议/ F67108864。 / F代表“ F'ing hell为什么堆栈与堆相比如此之小?”。 67108863是任意的。
答案 5 :(得分:1)
如果您想避免使用new[]
或避免使用std::vector
,请将数组设为全局。这会将数组放在堆上,不会发生堆栈溢出。
答案 6 :(得分:0)
您的声明看起来有点像dp
将用作矩阵。在这种情况下,专用(密集)矩阵类(如boost::numeric::ublas::matrix
)是最简单的解决方案,比矢量矢量更容易,更局部。如果矩阵是稀疏填充的,则改为使用稀疏矩阵类。
答案 7 :(得分:0)
所以如果我想创建一个大数组 如上所述,我该怎么办?
避免在这些情况下使用堆栈(换句话说,避免创建类似于在函数内部工作时未分配堆的数组)。只是为了给你一个想法,我的线程局部堆栈只有16千字节大。 4501 * 4501 * 4(假设每个int 4个字节)= ~81兆字节。
请考虑这样的事情:
typedef vector<int> Row;
typedef vector<Row> Matrix;
Matrix dp(4501, Row(4501) );
如果要创建10x50矩阵:
Matrix dp(10, Row(50) );
你可以像普通的dp数组一样使用它,因为它没有溢出堆栈。这个将被分配并自动从堆中解除分配,这样你就不必担心堆栈溢出了。
dp[5][10] = 123;
祝你好运!
[编辑]还有一些矩阵解决方案值得研究,但考虑到主题的性质,建议提升可能有点为时过早。