c++ - 为什么 front() 返回的值在 std::queue 的 pop() 之后仍然存在?

标签 c++ queue

我将从 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() 之后仍然有“一”

最佳答案

因为 val 不是引用。不要排在队列前面或其他任何地方。

当你做的时候

val = q.front();

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

您稍后对队列所做的操作不会影响此拷贝。

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

请记住,通过将 val 设为引用,它只会引用队列中的一个元素。一旦弹出前面板一次,该引用就失效了。添加新元素不会改变你的引用,它仍然会引用队列中的相同元素,它不会引用新的前端。并且您无法在绑定(bind)后重新绑定(bind)引用。

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

关于c++ - 为什么 front() 返回的值在 std::queue 的 pop() 之后仍然存在?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49666710/

相关文章:

c++ - MS Visual Studio 2012 Express 是否同时包含 C#、Visual Basic、C++?

c++ - 将可选属性表示为 C++ 类成员

c++ - 从十六进制转换为 LPCVOID 切断了地址的一半

linux - Linux RHEL 上的 RabbitMQ 内部内存路径映射到另一个位置

c++ - 向 Qt 项目添加状态对话框

c++ - labels_graph 上的广度优先搜索

swift 4 : Creating an asynchronous serial queue with 2 seconds wait after each job

python - Manager.Namespace() 内的多处理队列

python - multiprocessing.Queue 和 queue.Queue 的实现

python - python中是否有非同步队列