所以我在向量中插入了一堆值(我尝试了一个具有相同结果的地图)并且我在第二个向量上继续得到分段错误,即 VectorMin 。我尝试取消注释,如果我只使用VectorMax,那么一切都很好。
出于某种原因,如果我试图操纵两个向量,我将得到一个分段错误。如果我取消注释任何一个,程序加载正确。
我使用的是一个3.5mb的文件,每行有1000行和362个值。
std::vector<float> vectorMax, vectorMin;
void Parser::isMaxMinVector(float value, int index){
//if the index of the vector is not yet used
if (index >= vectorMax.size()){
vectorMax.push_back(value);
}
if(index >= vectorMin.size()){
vectorMin.push_back(value);
}
//if new vector is larger, then overwrite it
//if(vectorMax[index] > value) vectorMax[index] = value;
//if(vectorMin[index] < value) vectorMin[index] = value;
}
void Parser::parseLine(char* line){
std::vector<float> vectors;
char* point;
char* tk1 = strtok(line, ",");
char* tk2 = strtok(NULL, ",");
int i=0;
if(tk1 == NULL || tk2 == NULL) return;
float x = strtof(tk1, NULL);
float y = strtof(tk2, NULL);
XYPair pair = XYPair(x, y);
isMaxXY(x,y);
while(point=strtok(NULL, ",")){
//convert the token to float
float f_point = strtof(point, NULL);
//push the float to the vector
vectors.push_back(f_point);
isMaxMinVector(f_point, i);
i++;
}
}
答案 0 :(得分:1)
您多次更改帖子的代码。不过这段代码片段
if (index >= vectorMax.size()){
vectorMax[index] = value;
}
无效,因为您使用索引为&gt; = size()的不存在的元素。我想你的意思是
if ( !vectorMax.empty() && index < vectorMax.size()){
vectorMax[index] = value;
}
或者应用成员函数调整大小。例如
if (index >= vectorMax.size()){
vectorMax.resize( index + 1 );
vectorMax[index] = value;
}
答案 1 :(得分:0)
您是否调整了向量的大小,以便为它们分配足够的存储空间?如果该元素没有值,则IIRC operator []不会调整其未定义的行为。如果你想要稀疏的东西,你将不得不使用类似地图的东西。
答案 2 :(得分:0)
我认为来自莫斯科的弗拉德回答如下是正确的。它有效吗?
if (index >= vectorMax.size()){
vectorMax[index] = value;
}
答案 3 :(得分:0)
如果你没有在其他地方触摸矢量,这将有效:
//if the index of the vector is not yet used
if (index >= vectorMax.size()){
vectorMax.push_back(value);
// update index here:
index = vectorMax.size();
}
if(index >= vectorMin.size()){
vectorMin.push_back(value);
// and here:
index = vectorMax.size();
}
//if new vector is larger, then overwrite it
if(vectorMax[index] > value) vectorMax[index] = value;
if(vectorMin[index] < value) vectorMin[index] = value;
然而,问题在于,如果索引更改index
,则不会更新值。您可以在插入签名中使用int &index
来更改它。弗拉德的方法对此更好。另一方面,不清楚向量中的其他元素包含什么(如果你可以创建vectorMin
人工制品,例如)。