在C++中循环对std::deque执行pop_front()操作是否合法?
关于这段deque操作代码的合法性分析
结论
这段代码属于未定义行为,是不合法的,你的判断完全正确。
原因分析
首先明确std::deque的迭代器失效规则:调用pop_front()时,仅指向被删除首元素的迭代器、指针、引用会失效,其余位置的迭代器不受影响。
问题出在for循环的固有执行顺序上:
- 首次循环初始化时,
it被赋值为d.begin(),指向首元素1 - 判定
it != d.end()成立,进入循环体执行d.pop_front(),首元素1被删除,此时指向首元素的it已经失效 - 循环体执行完毕后,会自动执行
it++,对已经失效的迭代器执行递增操作属于C++标准明确规定的未定义行为,程序可能崩溃、产生异常结果或者看起来正常运行,但其行为完全不可预测。
合法写法参考
如果你只是想要清空deque,直接调用clear()方法即可,不需要手动遍历删除:
d.clear();
如果你确实需要逐个弹出首元素做业务处理,可以直接判断容器非空即可,不需要迭代器:
while (!d.empty()) { // 可在这里处理d.front()的业务逻辑 d.pop_front(); }
如果必须在遍历时删除首元素且要保留迭代器逻辑,可以利用erase()的返回值获取下一个有效迭代器:
for (auto it = d.begin(); it != d.end(); ) { it = d.erase(d.begin()); }
内容的提问来源于stack exchange,提问作者Nick Kovac
相关产品推荐
相关产品推荐

