C - 插入地图或向量时的分割故障



,所以我将一堆值插入向量(我尝试了具有相同结果的地图),并且我不断在第二个矢量上得到分割故障,这是 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++;
    }
}

您几次更改了帖子的代码。尽管如此,此代码段

if (index >= vectorMax.size()){
    vectorMax[index] = value;
}

是无效的,因为您使用索引> = size()的不存在元素。我认为你的意思是

if ( !vectorMax.empty() && index < vectorMax.size()){
    vectorMax[index] = value;
}

或应用成员功能调整大小。例如

if (index >= vectorMax.size()){
    vectorMax.resize( index + 1 ); 
    vectorMax[index] = value; 
}

您是否对向量进行了尺寸,以便他们分配了足够的存储空间?IIRC运算符[]没有调整大小,如果该元素没有值,则其不确定的行为。如果您想要一些稀疏的东西,则必须使用地图之类的东西。

我认为莫斯科的vlad答案是正确的。

   if (index >= vectorMax.size()){
      vectorMax[index] = value;
     }

如果您不触摸其他任何地方的向量,这将起作用:

//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伪像,例如)。

相关内容

  • 没有找到相关文章

最新更新