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
答案 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)
简单地说:迭代时不能修改矢量。迭代器将变为无效,这将为您提供断言。
要正确执行您想要的操作,您可以考虑创建一个包含要保留的值的向量副本,以及一个包含要删除的值的向量。然后用保留值替换数字向量。