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

时间:2013-08-16 12:00:51

标签: c++

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

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

1 个答案:

答案 0 :(得分:1)

通过按删除的元素数量调整“删除”来做正确的事情。只需确保'delpositions'按升序排序。

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

我考虑

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

更好的解决方案