c ++中的优先级队列

Kei*_*ith 6 c++ iterator priority-queue

有没有办法在c ++中迭代优先级队列?我的理解是它们或多或少是不可变的,容器的唯一操作是顶层元素.我希望能够打印出优先级队列的内容,但不确定如何解决问题.

sky*_*ack 6

底层容器是一个protected名为的数据成员c(有关详细信息,请参见此处).因此,您始终可以从a继承std::priority_queue并在该容器上导出几个迭代器(如果可用).
作为一个最小的工作示例:

#include<queue>
#include<iostream>

struct MyPriorityQueue: std::priority_queue<int> {
    auto begin() const { return c.begin(); }
    auto end() const { return c.end(); }
};

int main() {
    MyPriorityQueue pq;
    pq.push(0);
    pq.push(1);
    for(auto &v: pq) {
        std::cout << v << std::endl;
    }
}
Run Code Online (Sandbox Code Playgroud)

注意:std::通常不鼓励从命名空间中的数据结构继承.
话虽如此,它至少起作用.


上面的代码适用于C++ 14.
下面是一个稍微修改过的版本,也可以在评论中的要求下在C++ 11中使用:

#include<queue>
#include<iostream>

struct MyPriorityQueue: std::priority_queue<int> {
    decltype(c.begin()) begin() const { return c.begin(); }
    decltype(c.end()) end() const { return c.end(); }
};

int main() {
    MyPriorityQueue pq;
    pq.push(0);
    pq.push(1);
    for(auto &v: pq) {
        std::cout << v << std::endl;
    }
}
Run Code Online (Sandbox Code Playgroud)