繁体   English   中英

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

[英]Valid or Invalid Iterators And Iterator Positions

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

我似乎已经发现了问题,因为我没有将第二个部分括在括号(第二个部分)中,这在擦除向量的末尾时会导致上述错误。

现在,我已经确定并纠正了问题,如果有人可以确认我下面的简单例程实际上是有效的且没有错误,并且以这种方式在for循环中调用delete(),我将不胜感激。

我意识到只有在按照从头到尾的顺序擦除元素位置时,此例程才有效。 请在下面查看我的代码:

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)

您可以通过删除元素的数量来调整“分布”来做正确的事情。 只要确保“布置”按升序排列即可。

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

我认为

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

更好的解决方案

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM