我正在尝试使用称为单元格的对象填充二维向量(817乘577)。这些单元格具有一组成员值(浮点数,其他向量等)。在某个时刻程序停止并抛出错误"vector<T> too long"
。
以下是单元格的类定义和完整循环:
struct cell
{
int x;
int y;
int country;
vector<int> popO;
vector<int> popS;
vector<float> Rainfall;
double Cropland;
vector<movement> outm;
vector<movement> inm;
vector<double> AgeMaleFemale;
vector<double> AgeMaleFemaleMortality;
double Fertility;
};
vector<vector<cell>> cells;
void fillCells(dataserver D)
{
cout<<"start filling"<<endl;
int rows=577;
int columns=817;
cell X;
vector<vector<cell>> output(rows,vector<cell>(columns,X));
cout<<"start loop"<<endl;
for (int i=0;i<rows;i++)
{
cout<<i<<" ";
for (int j=0;j<columns;j++)
{
int p=-9999;
cell tmpC;
tmpC.x=i;
tmpC.y=j;
tmpC.country=D.CO[i][j];
tmpC.popO.resize(3,0);
tmpC.popO[0]=int(D.PO[0][i][j]);
tmpC.popO[1]=int(D.PO[1][i][j]);
tmpC.popO[2]=int(D.PO[2][i][j]);
tmpC.Rainfall.resize(10,0);
for (int k=0;k<10;k++)
{
tmpC.Rainfall[k]=D.R[k][i][j];
}
tmpC.popS.resize(10,0);
tmpC.Cropland=D.CPC[i][i];
if (tmpC.country!=-9999)
{
tmpC.Fertility=D.F[tmpC.country];
tmpC.AgeMaleFemale.resize(18,0);
tmpC.AgeMaleFemale=D.AMF[tmpC.country];
tmpC.AgeMaleFemaleMortality.resize(18,0);
tmpC.AgeMaleFemaleMortality=D.M[tmpC.country];
}
output[i][j]=tmpC;
}
}
cells=output;
}
谷歌搜索了一下我发现sizeof(cell)乘以向量中的单元格数量应该小于vector :: max_size()
sizeof(单元格)为144 - > 144 * 817 * 577 = 67882896
max_size是268345455
那么所有细胞都不应该有足够的空间,或者我错过了什么? 提前谢谢!
一些额外的信息:
在Windows 7 64bit上运行,使用Visual Studio 2010进行编译,32位
关于max_size的信息实际上来自这里: stl "vector<T> too long"
答案 0 :(得分:9)
由于我没有足够的代表发表评论,所以你得到它作为答案。
错误文本听起来像是在Windows机器上 http://msdn.microsoft.com/en-us/library/2af6btx2%28v=vs.80%29.ASPX
而且我认为这与调整大小有关,因为创建一个太大的向量会抛出bad_alloc(在linux上,因此在windows上可能会有所不同)。
尝试并在
中包装所有调整大小的调用try {
// resize call here
} catch (Exception &e) {
std::cerr << e.what() << std::endl
<< "Some text that identifies the line" << std::endl;
}