【发布时间】:2011-03-09 10:22:38
【问题描述】:
大家好
我正在尝试使用 C++ 在 VS 2010 中创建一个非常大的数组。
当我尝试创建如下所示的数组时
int dp[4501][4501]
or
int dp[1000][1000]
它抛出了一个异常“堆栈溢出” 然后我把它改成:
int dp[100][100]
一切都很好。
那么如果我想创建一个像上面这样的大数组,我应该怎么做呢?
最好的问候,
【问题讨论】:
标签: c++
大家好
我正在尝试使用 C++ 在 VS 2010 中创建一个非常大的数组。
当我尝试创建如下所示的数组时
int dp[4501][4501]
or
int dp[1000][1000]
它抛出了一个异常“堆栈溢出” 然后我把它改成:
int dp[100][100]
一切都很好。
那么如果我想创建一个像上面这样的大数组,我应该怎么做呢?
最好的问候,
【问题讨论】:
标签: c++
使用动态分配或 STL。最近有一个关于一个非常相似的问题的帖子。见this。
【讨论】:
你应该使用动态分配:
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));
【讨论】:
int_array 实际上是一个int vector,而您的int_double_array 与一个double 毫无关系。 (另外,我必须进行 两次 查找才能找出它实际上是什么。) 糟糕的风格,恕我直言。仅将 typedef 用于非常复杂或神秘的事物,即使这样,也仅当它们的声明在您的代码中频繁出现时。 (我会想到成对向量映射的迭代器或函数指针。)对于只使用了两三次的声明,它们是一种混淆工具。
std::vector< std::vector< int > >::const_iterator 和类似的东西。根据我的经验,有用的 typedef 与混淆的 typedef 的比率约为 20 分之一。
如果您想避免使用new[],或避免使用std::vector,请将数组设为全局。这会将数组放在堆上,不会发生堆栈溢出。
【讨论】:
vector 不是唯一的容器类)。
来自 Parashift 常见问题的文本: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?
【讨论】:
您的堆栈溢出了太多位。你必须把它们排干。最好放在一堆其他位上。我建议 /F67108864。 /F 代表“F'ing hell 为什么堆栈与堆相比如此之小?”。 67108863 是任意的。
【讨论】:
您的声明看起来有点像dp 将用作矩阵。在这种情况下,专用(密集)矩阵类(如boost::numeric::ublas::matrix)是最简单的解决方案,比向量向量更容易且更局部。如果矩阵是稀疏填充的,请改用稀疏矩阵类。
【讨论】:
所以如果我想创建一个大数组 像上面一样,我该怎么办?
避免在这些情况下使用堆栈(换句话说,避免在函数内部工作时创建类似这些不是堆分配的数组)。只是给你一个想法,我的线程本地堆栈只有 16 KB 大。 4501 * 4501 * 4(假设每个 int 4 个字节)= ~81 MB。
请考虑这样的事情:
typedef vector<int> Row;
typedef vector<Row> Matrix;
Matrix dp(4501, Row(4501) );
如果你想创建一个 10x50 矩阵:
Matrix dp(10, Row(50) );
您可以像使用普通 dp 数组一样使用它,但它不会溢出堆栈。这一个将被分配并自动释放到堆中/从堆中释放,因此您在使用时不必担心堆栈溢出。
dp[5][10] = 123;
祝你好运!
[编辑] boost 中也有矩阵解决方案值得研究,但考虑到主题的性质,建议 boost 可能有点为时过早。
【讨论】: