有效的或无效的迭代器和迭代器位置

问题描述:

我有一个简单的例子程序,用于清除矢量元素,其位置存储在另一个矢量中。我一直在使用这种方法一段时间,直到最近才遇到一个错误:表达式:向量迭代器+偏移超出范围。有效的或无效的迭代器和迭代器位置

我似乎已经发现问题,即在erase()调用的参数内,我没有将括号中的第二部分括起来,偶尔会导致上述错误消除临近向量末尾的元素。

现在我已经确定并纠正了这个问题,如果有人能确认我的简单例程实际上是有效的并且没有错误,并且在此for循环中调用erase()方式没问题。

我意识到这个例程只有在按照先到后的顺序擦除元素位置时才有效。请参阅我的代码如下:

vector<int> mynumbers; 
mynumbers.push_back(4); 
mynumbers.push_back(5); 
mynumbers.push_back(6); 
mynumbers.push_back(7); 

vector<int> delpositions; 
delpositions.push_back(1); 
delpositions.push_back(2); 
delpositions.push_back(3); 

for(unsigned int i = 0; i < delpositions.size(); ++i) 
    mynumbers.erase(mynumbers.begin() + (delpositions[i] - i)); 

// Used To Be: delpositions[i] - i Which Caused The Error! Instead of: (delpositions[i] - i) 
+0

你不给足够的上下文是明确的这件事,但你的做法(存储元素的绝对位置在单独的载体抹去,是要被排序)倾向于指示[代码气味](http://en.wikipedia.org/wiki/Code_smell)。 –

您通过调整删除元素的“删除位置”来做正确的事情。只要确保'delpositions'按升序排序。

以相反顺序擦除(从上到下)可能会更有效一些。

我认为

vector result; 
result.reserve(mynumbers.size() - delpositions.size()); 
// copy valid positions to result 
mynumbers.swap(result) 

一个更好的解决方案

+0

谢谢你们两位。非常感激。我可能会不时地使用这种方法,代码味道与否。 – user1831698

+0

编辑:感谢链接'代码味道'我以前没有读过。 – user1831698

+0

谢谢你的Dieter。我也会考虑这种方式。干杯。 – user1831698