gpt4 book ai didi

c++ - C++列表/队列的顶部返回值

转载 作者:行者123 更新时间:2023-12-03 06:56:41 25 4
gpt4 key购买 nike

我有一个C++代码,如下所示:

#include <iostream>
#include <queue>
#include <list>
using namespace std;

int main(){
priority_queue<pair<int, int>> q;
q.push({8, 8});
q.push({19, 19});
q.push({23, 23});

while (q.size() > 0){
auto& cur = q.top();
q.pop();
cout << cur.first << " " << cur.second << " "; // returns 19 19 8 8 8 8
}
cout << endl;

list<pair<int, int>> newq;
newq.push_back({19, 19});
newq.push_back({8, 8});
newq.push_back({23, 23});
while (newq.size() > 0){
auto& cur = newq.front();
newq.pop_front();
cout << cur.first << " " << cur.second << " "; // returns 19 19 8 8 23 23
}
cout << endl;
return 0;
}
使用 listauto&遍历 auto会产生相同的输出。但是我试图理解为什么如果在遍历优先级队列时使用 auto&时,输出是错误的。如果我将其更改为 auto,则输出正确:
    priority_queue<pair<int, int>> q;
q.push({8, 8});
q.push({19, 19});
q.push({23, 23});

while (q.size() > 0){
auto cur = q.top();
q.pop();
cout << cur.first << " " << cur.second << " "; // returns 23 23 19 19 8 8
}
cout << endl;
感谢您的澄清!

最佳答案

    auto& cur = q.top();
q.pop();
auto &在这里不起作用而 auto起作用的原因是,由于有了 auto &,您可以在队列的 top()处获得对对象的引用...
……并立即在下一行中,删除并销毁队列顶部的对象,从而留下一个悬空的引用。
从那时起,使用该引用将导致未定义的行为。
而是使用 auto复制对象,并且在原始对象被销毁后,副本仍然存在。
std::list一起使用时,类似的错误当然有可能不会产生明显的错误结果,但仍然是未定义的行为。 “未定义的行为”的确切含义是:任何事情都可能发生。包括纯粹出于偶然而获得预期结果。一个好的静态分析工具,例如 valgrind,应该能够捕获此错误。

关于c++ - C++列表/队列的顶部返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64189855/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com