下列代码编译运行后的结果是()
vector<int> vecNum{3,1,2,3,5,4}; auto iter = vecNum.begin(); while (iter != vecNum.end()) { if (3 == *iter) vecNum.erase(iter); ++iter; } iter = vecNum.begin(); while (iter != vecNum.end()) { std::cout << *(++iter); }
int main() { int a[] = {1,2,3,3,4,5,6,3}; vector<int> ivec(a,a+8); for(vector<int>::iterator it=ivec.begin();it!=ivec.end();){ if((*it) == 3) { cout<<"删除之前地址:"<<&*it<<endl; it=ivec.erase(it); cout<<"删除之后地址:"<<&*it<<endl;// 删除前和删除后地址不变,说明只是元素前移,迭代器不移动 } else it++; } cout<<"删除之后vector尾元素地址:"<<addressof(*ivec.end())<<endl;// 获取迭代器地址的方式二 return 0; }
while (iter != vecNum.end()) { if (3 == *iter) vecNum.erase(iter); ++iter; }vecNum.erase(iter);执行完毕后,iter指向的值被删除,iter也被释放。因此接下的 ++ iter 会在执行的时候报错导致程序崩溃。因为iter此时是无指向的。
while(iter != vecNum.end()) { if(3== *iter)iter=vecNum.erase(iter); //我们将erase的返回值赋给iter,则程序正常执行。++iter; }