断言错误,使用 STL 向量

Assertion Error, using STL Vector

本文关键字:STL 向量 使用 错误 断言      更新时间:2023-10-16
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

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

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

从向量中删除一个元素会使该元素及以后的所有迭代器无效(在当前标准中,有一个未解决的问题可以更改它)。

第一个问题是您希望流程的效率如何,如果您不太关心性能,您可以做一个简单的循环:

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

简单地说:你不能在迭代时修改一个向量。迭代器将变得无效,这将得到一个断言。

正确执行所需的操作,可以考虑创建包含要保留的值的向量副本,以及包含要删除的值的向量。然后将数字向量替换为具有要保留的值的数字向量。