【发布时间】:2019-10-25 15:33:14
【问题描述】:
以下简化代码有效,因为它删除了所有矢量元素。但是,我不明白为什么。由于f.erase(r) 没有捕获返回的值,这将是新的迭代器值,并且没有其他迭代器增量器,并且according to documentation, erase(iterator position) 参数不是通过引用传递的,迭代器在哪里得到高级?
#include <iostream>
#include <vector>
int main ()
{
std::vector<int> f = {1,2,3,4,5};
auto r = f.begin();
while (r != f.end())
{
std::cout << "Erasing " << *r << std::endl;
f.erase(r);
}
return 0;
}
【问题讨论】:
-
欢迎来到未定义的行为领域,您想要的结果甚至可以是您得到的结果。如果你想清空一个向量,只需使用
clear()->f.clear(); -
erase使迭代器无效,因此您不应在此之后使用r。 “它有效”是未定义行为的最糟糕体现