With the following code, it runs in a infinite loop, because in the second loop, the priority queue's top function still returns the old top, rather than the new top. I have to access the correct top by removing the reference symbol. How does it happen?
My compiling environment is Visual studio 2022.
#include <iostream>
#include <queue>
struct ListNode {
    int val;
    ListNode* next;
    ListNode() : val(0), next(nullptr) {}
    ListNode(int x) : val(x), next(nullptr) {}
    ListNode(int x, ListNode* next) : val(x), next(next) {}
    
};
using namespace std;
int main()
{
    ListNode* n1 = new ListNode(1);
    ListNode* n4 = new ListNode(4);
    vector<ListNode*> lists{ n1
        , n4 
    };
    priority_queue<ListNode*> q;
    for (auto n : lists) {
        q.push(n);
    }
    ListNode* pre = new ListNode(-1);
    auto tmp = pre;
    while (not q.empty()) {
       // will execute correctly if remove &
        auto& node = q.top();
        q.pop();
        tmp->next = node;
        if (node->next) {
            q.push(node->next);
        }
        tmp = tmp->next;
    }
    
}
Aucun commentaire:
Enregistrer un commentaire