0

我在下面有一个简单的示例例程,用于擦除向量元素,其位置存储在另一个向量中。我已经使用这种方法一段时间了,直到最近才遇到错误:表达式:向量迭代器 + 偏移超出范围。

我似乎发现了问题,在 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)
4

1 回答 1

1

您可以通过根据擦除的元素数量调整“删除”来做正确的事情。只需确保“删除”按升序排序。

以相反的顺序(最后到第一个)擦除可能更有效。

我认为

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

更好的解决方案

于 2013-08-16T12:11:07.687 回答