C ++ - 在Map或Vector中插入时的分段错误

时间:2014-01-26 22:56:53

标签: c++ vector map segmentation-fault

所以我在向量中插入了一堆值(我尝试了一个具有相同结果的地图)并且我在第二个向量上继续得到分段错误,即 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++;
    }
}

4 个答案:

答案 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人工制品,例如)。