我正在尝试为矢量矢量保留空间,但它不起作用并引发以下错误:
terminate called after throwing an instance of 'std::bad_alloc'
what(): std::bad_alloc
每次我使用足够多的号码。我所拥有的最小版本如下:
#include <vector>
#include <iostream>
using namespace std;
int main(){
int base;
cout << "Enter Base: ";
cin >> base;
int dimension;
cout << "Enter Dimension: ";
cin >> dimension;
int perms = 1;
for(int i=0; i<dimension; i++){
perms *= base;
} // This gets the number of permutations with repetition
int length;
cout << "Enter Length: ";
cin >> length;
float structSize = 1.0;
for(float i=0.0; i<length; i++){
structSize *= perms-i;
structSize /= (i+1.0);
} // This gets the number of combinations
vector< vector< vector<double> > > allStructs;
allStructs.reserve(structSize);
return 0;
}
它适用于大型structSizes,但在base = 3,dimension = 4,length = 6时失败,这使得structSize = 324,540,216。这可能有用吗?
答案 0 :(得分:5)
你需要考虑你的记忆力。
它适用于大型structSizes,但在base = 3,dimension = 4,length = 6时失败,这使得structSize = 324,540,216。这可能有用吗?
所以你在抽象层面上正在做的是分配一个包含324,540,216
对象的vector<vector<double>>
个实例的数据结构。
以下是我们对vector
个对象的了解:
vector<double>
对象时,每次创建一个对象时,它将消耗另一个[至少 - ] 16个字节。所以从表面上看,你的allStructs.reserve(structSize)
通话分配了5千兆字节。它可能分配的不止于此,因为矢量元数据的大小很可能大于16个字节。
答案 1 :(得分:2)
将您的StructSize声明为double StructSize = 1.0;
,然后它应该“逻辑”工作。
但是,由于您的PC可能存在内存限制,reserve()
可能无效。