0
for(myIterator = numbers.begin();myIterator != numbers.end() ;myIterator++)
{
    resultVect.push_back(*myIterator+2);

    numbers.erase(myIterator+2);            

}

numbers consist of a series of numbers (eg 1,2,3,4,5,6,7) Then I would like to erase every 3rd number. Something like,

1 2 3 4 5 6 ( First round -> 3 is out)

1 2 4 5 6 ( Second round -> 6 is out)

1 2 4 5 ( Third round -> 4 is out)

and so on.

I will store the number that goes out in another vector (resultVect).

Im getting Assertion error. Pls advise tq

4

3 回答 3

1

当您使用erase矢量时,它将重新定位擦除位置之后的元素,因此之后的迭代器将失效。

其次,当你说iterator + 2这也可能超出向量的范围。

于 2013-10-16T15:13:26.570 回答
1

从向量中删除一个元素会使该元素及其他元素的所有迭代器无效(在当前标准中,有一个未解决的问题来改变这一点)。

第一个问题是您希望该过程的效率如何,如果您(不太关心)性能,您可以执行一个简单的循环:

for (int i = 3; i < input.size(); i+=3) {
   result.push_back(input[i]);
}
for (int i = (input.size()+2)/3 - 1; i >= 0; --i) {
   input.erase(input.begin()+i*3);
}

如果性能很关键,您可以查看std::remove算法并使用相同的方法来避免在运行算法时执行元素的多个副本。基本上,您需要在原始容器中读取和写入头,并且如果不满足条件,则仅从读取位置复制到写入位置。

于 2013-10-16T15:31:39.840 回答
0

简单地说:你不能在迭代向量时修改它。迭代器将变为无效,这将为您提供断言。

为了正确地做你想做的事,你可以考虑创建一个向量的副本,其中包含要保留的值,以及一个包含要删除的值的向量。然后用要保留的值替换数字向量。

于 2013-10-16T15:15:30.330 回答