断言错误,使用STL Vector

时间:2013-10-16 15:09:22

标签: c++ stl

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

    numbers.erase(myIterator+2);            

}

数字由一系列数字组成(例如1,2,3,4,5,6,7) 然后我想删除每个第3个号码。 像,

1 2 3 4 5 6(第一轮 - > 3出局)

1 2 4 5 6 (第二轮 - > 6出局)

1 2 4 5(第三轮 - > 4出局)

等等。

我将存储另一个向量中出现的数字(resultVect)。

我得到断言错误。请告知tq

3 个答案:

答案 0 :(得分:1)

当你使用erase作为向量时,它会在擦除位置之后重新定位元素,这样之后的迭代器就会失效。

第二,当你说iterator + 2时,它也可能超出矢量的范围。

答案 1 :(得分: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算法并使用相同的方法避免在运行算法时执行元素的多个副本。基本上,您需要在原始容器中使用读取和写入头,并且如果不满足条件,则只能从读取位置复制到写入位置。

答案 2 :(得分:0)

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

要正确执行您想要的操作,您可以考虑创建一个包含要保留的值的向量副本,以及一个包含要删除的值的向量。然后用保留值替换数字向量。