C++ &引用;向量<;T>;太长了”;填充std::vector时出错
我试图用称为细胞的对象填充二维向量(817乘577)。这些单元格有一组成员值(浮动、其他向量等)。在某一点,程序停止并抛出错误C++ &引用;向量<;T>;太长了”;填充std::vector时出错,c++,vector,C++,Vector,我试图用称为细胞的对象填充二维向量(817乘577)。这些单元格有一组成员值(浮动、其他向量等)。在某一点,程序停止并抛出错误“vector too long”。 以下是单元格的类定义和完整循环: struct cell { int x; int y; int country; vector<int> popO; vector<int> popS; vector<float> Rainfall;
“vector 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;
}
结构单元
{
int x;
int-y;
国际国家;
载体popO;
媒介持久性有机污染物;
矢量降雨;
双田;
矢量输出;
向量inm;
媒介:雌性;
病媒感染;女性死亡率;
双生育力;
};
载体细胞;
空填充单元格(数据服务器D)
{
cout因为我没有足够的代表发表评论,所以你可以把它作为一个答案 错误文本听起来像是在windows计算机上 我认为这与调整大小有关,因为创建一个太大的向量会导致错误的分配(在linux上,所以在windows上可能会有所不同) 尝试将所有调整大小的调用包装到
try {
// resize call here
} catch (Exception &e) {
std::cerr << e.what() << std::endl
<< "Some text that identifies the line" << std::endl;
}
试试看{
//在这里打电话
}捕获(例外和e){
因为我没有足够的代表发表评论,所以你可以把它作为一个答案
错误文本听起来像是在windows计算机上
我认为这与调整大小有关,因为创建一个太大的向量会导致错误的分配(在linux上,所以在windows上可能会有所不同)
尝试将所有调整大小的调用包装到
try {
// resize call here
} catch (Exception &e) {
std::cerr << e.what() << std::endl
<< "Some text that identifies the line" << std::endl;
}
试试看{
//在这里打电话
}捕获(例外和e){
为什么不每隔一段时间打印一次向量的长度来验证你对其长度的假设?通过谷歌搜索,我发现sizeof(cell)乘以向量中的单元数应该小于vector::max_size(),我不知道你从哪里得到的,但这是不正确的(类似的事情可能是真的,但我认为你误解了你读到的任何东西)@user2160180-很抱歉关于max_size()的离题
。若要找出问题所在,请开始注释代码,直到问题消失。例如,不要将任何内容存储到tmpC
;只需将默认初始化的单元格填充到输出中即可。如果这样做有效,请开始添加位和数据片段,直到您确定了罪魁祸首。@user2160180:我的观点是现在你有一个你不理解的问题,所以要调试它,你需要验证你的假设。你会发现至少有一个假设不成立,否则你就不会在这里了!@user2160180关于所有的复制,你可能会大大减少它。为什么不偶尔打印一次向量的长度来验证你对其长度的假设谷歌搜索一下,我发现sizeof(cell)乘以向量中的单元数应该比vector::max_size()小,我不知道你从哪里得到的,但这是不正确的(类似的事情可能是真的,但我认为你误解了你读到的任何内容)@user2160180-很抱歉关于max_size()的离题
。若要找出问题所在,请开始注释代码,直到问题消失。例如,不要将任何内容存储到tmpC
;只需将默认初始化的单元格填充到输出中即可。如果这样做有效,请开始添加位和数据片段,直到您确定了罪魁祸首。@user2160180:我的观点是目前,你有一个你不理解的问题,所以要调试它,你需要验证你的假设。你会发现至少有一个假设不成立,否则你就不会在这里了!@user2160180关于所有的复制,你可能会大大减少它。这就是为什么代表壁垒不起作用。人们认为代表壁垒是为了强制不起作用而存在的哼哼,打破系统,而不是说“哦,好吧,那我现在就闭嘴”。令人烦恼的是,这是一个糟糕的例子,因为你的“评论”很有见解,也很有用。谢谢你发布它!我的意思是,真的,这是一个答案…虽然这没有提供答案,但在try语句中包装不同的块,看看到底是哪个调用导致了异常。它的“tmpC.Fertility=D.F[tmpC.country];”这似乎是一个指数出界的问题,因为国家指数以1开始,向量为0。所以非常感谢!这就是为什么代表壁垒不起作用。人们认为代表壁垒是为了迫使他们打破系统,而不是说“哦,好吧,我现在就闭嘴”。令人烦恼的是,这是一个糟糕的例子,因为你的“评论”很有见解,也很有用。谢谢你发布它!我的意思是,真的,这是一个答案…虽然这没有提供答案,但在try语句中包装不同的块,看看到底是哪个调用导致了异常。它的“tmpC.Fertility=D.F[tmpC.country];”这似乎是一个指数出界的问题,因为国家指数以1开头,向量以0开头。所以非常感谢!