我是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)
,但这也给了我一个核心转储。难道我做错了什么?谢谢你的帮助!
答案 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;