#include <vector>
#include <iostream>
int main()
{
std::vector<int> testVec = { 1,2,2,2,3,4,5,6 };
for (auto iter = testVec.begin(); iter != testVec.end();)
{
if (*iter == 2)
{
iter = testVec.erase(iter); // erase返回下一个迭代器的指针,需要重新赋值iter
}
else // 没有这个else会越过第二个2,输出结果为1 2 3 4 5 6 [// else]
{
iter++; // 非匹配的数据才需要++
// erase重新赋值之后的iter已经指向下一个迭代器了
//不需要++
}
}
for (auto item : testVec)
{
std::cout << "vecvalueis:" << item << " ";
}
}
带else的输出结果:
注释掉else的执行结果
通过调试发现,即使不将iter重新赋值,也可以实现同等效果,通过看内存地址,发现每次erase之后,返回的iter地址和erase的iter地址是同一个地址,退出vecter的erase底层可能自动将下一个位置的数据前移了。