擦除2D矢量中的行 - 分割错误

时间:2015-12-11 05:26:14

标签: c++ stl segmentation-fault

我是C ++的新手,现在正在学习矢量。我试图从2D矢量中删除一行,但到目前为止,我所有的尝试都导致了一个segmemtation错误。这是我一直在尝试的代码 -

vector<vector<int> > myVector;
...
vector<vector<int> >::iterator row = myVector.begin();
while(row!=myVector.end())
{
    if((*row)[0] == -1)
        myVector.erase(row);
    else
        row++;
}

myVector是一个包含以下值的2D矢量:

 1 0
-1 1
 2 1
-1 0 ...

我需要删除第一个元素为-1的任何行。

我尝试过使用myVector.erase(myVector.begin() + row2delete),但这也给了我一个核心转储。难道我做错了什么?谢谢你的帮助!

4 个答案:

答案 0 :(得分:1)

您遇到的分段错误来自于.erase()使迭代器无效的事实。这就是擦除返回迭代器的原因,以便您可以将其用作下一个迭代器。

要删除2-dim向量中的行,您可以执行类似这样的操作(我使用std :: array在声明中获取固定大小)

std::vector<std::array<int,100>> dim2(100);

std::cout << dim2.size() << std::endl;

dim2[10][10] = 100001;
std::cout << dim2[10][10] << std::endl;

dim2.erase(dim2.begin()+9); // erase the 10th row

std::cout << dim2.size() << std::endl;
std::cout << dim2[10][10] << std::endl;

答案 1 :(得分:0)

来自http://www.cplusplus.com/reference/vector/vector/erase/

  

iterator erase (iterator position);

     

指向position及更高版本的迭代器,指针和引用无效......

执行myVector.erase(row)时,迭代器row无效,因此在下一次循环迭代中,尝试比较/取消引用它会中断。

vector::erase()将一个迭代器返回到被删除的元素之后的元素,因此您可能想要row = myVector.erase(row);

答案 2 :(得分:0)

这是你如何做到的。在使用vector进行迭代时,您无法完全删除iterator中的项目,而无效 iterator。但是,您可以myVector[i].clear(),但不会完全删除该行。为了做你想做的事,我可以建议两种方法:

vector<vector<int> > v(100); //Allocate space for 100 vectors

for(int i=0;i<100;i++)
    v[i].resize(100); //set the size of these 100 vectors to say 100 again

vector<int> indices; //This vector will store the indices of the vectors which have 1st element as -1
for(int i=0;i<v.size();i++) //iterator through vector storing vecgtors
    if(v[i].size()>0 && v[i][0]==-1) //Condition check
        indices.push_back(i); //add these indices you want to delete. *You cannot delete while looping

for(int i=0;i<indices.size();i++) //Now, delete them
    v.erase(v.begin()+indices[i]);



在这里,你必须迭代两次,这不是你需要的。一种更聪明的方法是保持一个由while循环控制的计数变量,这不会增加父容器的大小。您基本上是以非线性方式迭代。方法如下:

vector<vector<int> > v(100); //Allocate space for 100 vectors

for(int i=0;i<100;i++)
    v[i].resize(100); //set the size of these 100 vectors to say 100 again

int cnt=0; //Keep a counter variable
while(cnt<v.size())
{
    if(v[cnt].size()>0 && v[cnt][0]==-1)
        v.erase(v.begin()+cnt); //Do not increment count here! As the vector next comes here now after resizing
    else
        cnt++;
}
//Done!

我希望这有帮助!

答案 3 :(得分:0)

您可以做的最好的事情是制作另一个2D矢量并将所有不具有-1作为第一个元素的元素移位到新矢量,然后在移位完成后删除第一个矢量。 例如: -

vector<vector<int> > myVector;vector<vector<int> > myVector2;
int i=0;
while(i<myVector.size()){
    if(myVector[i][0] != -1){
        myVector2.push_back(myVector[i]);
}
return myVector2;