在 C++ 中,循环中 std::deque 上的 pop_front() 是否有效?

问题描述

如果我有这个代码

#include <deque>

int main()
{
    std::deque<int> d;

    d.push_back(1);
    d.push_back(2);
    d.push_back(3);
    d.push_back(4);
    d.push_back(5);

    for (std::deque<int>::iterator it = d.begin(); it != d.end(); it++)
    {
        d.pop_front();
    }

    return 0;
}

我想知道这是否有效,因为根据我的阅读,pop_front() 使任何迭代器或对被删除元素的引用无效。因此,如果“it”设置为 d.begin(),那么我们调用 d.pop_front(),然后我们执行“it++”,因为对 pop_front() 的调用删除了“it”所指的元素,不会是不是说再增加就无效了?

解决方法

它是无效的,因为一旦 scala> val obj = JsObject(Seq("abc" -> JsObject(Seq("edf" -> JsString("""111\2222"""))))) val obj: play.api.libs.json.JsObject = {"abc":{"edf":"111\\2222"}} scala> (obj \ "abc" \ "edf").as[String] val res0: String = 111\2222 被执行,it 不再指向一个有效的迭代器,因此 pop_front() 将产生未定义的行为。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...