填充std :: vector </t>时出现“vector <t>太长”错误

时间:2013-12-02 15:20:23

标签: c++ vector

我正在尝试使用称为单元格的对象填充二维向量(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"

1 个答案:

答案 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;
}