【问题标题】:Why does the value returned from front() exist even after pop() from std::queue?为什么即使在 std::queue 的 pop() 之后仍然存在从 front() 返回的值?
【发布时间】:2018-04-05 07:37:07
【问题描述】:

我正在将从 queue::front() 返回的值收集到一个局部变量中。根据文档, queue::front() 返回引用。 那么如果我从队列中弹出它,收集的值怎么还存在呢?

int main()
{
    std::string val;
    {
        std::queue<std::string> q;
        q.push("one");
        q.push("two");
        q.push("three");
        val = q.front();
        q.pop();
        q.pop();
        q.pop();
        std::cout << "is queue empty: " << boolalpha << q.empty() << '\n';
    }

    std::cout << "val: " << val << '\n';
}

输出是:

is queue empty: true
val: one

为什么 valpop()'ing 之后仍然有 "one"

【问题讨论】:

    标签: c++ queue


    【解决方案1】:

    因为val 不是参考。不要排在队列的最前面或其他任何地方。

    当你这样做时

    val = q.front();
    

    复制当前队列前面的内容到val

    您稍后对队列执行的操作不会影响此副本。

    如果您想要一个引用,那么您需要将val 设为一个引用。

    请记住,通过将val 设为引用,它只会引用队列中的一个元素。一旦你弹出前面一次,那个引用就失效了。添加新元素不会改变你的引用,它仍然会引用队列中的相同元素,它不会引用新的前面。而且一旦绑定就不能重新绑定引用。

    总而言之,在大多数用例中使用对队列中元素的引用是毫无用处的。

    【讨论】:

    • 简单地将val 设为引用将不允许 OP 引用队列的前面。毕竟无法重新绑定。
    猜你喜欢
    • 2014-09-22
    • 1970-01-01
    • 1970-01-01
    • 2018-09-26
    • 2015-09-30
    • 1970-01-01
    • 1970-01-01
    • 2012-02-29
    相关资源
    最近更新 更多