C++中的优先级队列
Priority Queues in c++
有没有办法在 C++ 中迭代优先级队列?我的理解是它们或多或少是不可变的,容器的唯一操作是对顶部元素。我希望能够打印出优先队列的内容,但不确定如何解决这个问题。
底层容器是一个名为 c
的 protected
数据成员(有关详细信息,请参阅 here)。因此,您始终可以从 std::priority_queue
和 export 继承该容器上的几个迭代器(如果可用)。
作为一个最小的工作示例:
#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;
}
}
注意:通常不鼓励从 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;
}
}
根据@skypjack 的回答,这是一个模板化版本:
#include<queue>
#include<iostream>
template<class T, class C = vector<T>, class P = less<typename C::value_type> >
struct MyPriorityQueue :
std::priority_queue<T,C,P> {
typename C::iterator begin() { return std::priority_queue<T, C, P>::c.begin(); }
typename C::iterator end() { return std::priority_queue<T, C, P>::c.end(); }
};
int main() {
MyPriorityQueue<int> pq;
pq.push(0);
pq.push(1);
for (auto &v : pq) {
std::cout << v << std::endl;
}
}
有没有办法在 C++ 中迭代优先级队列?我的理解是它们或多或少是不可变的,容器的唯一操作是对顶部元素。我希望能够打印出优先队列的内容,但不确定如何解决这个问题。
底层容器是一个名为 c
的 protected
数据成员(有关详细信息,请参阅 here)。因此,您始终可以从 std::priority_queue
和 export 继承该容器上的几个迭代器(如果可用)。
作为一个最小的工作示例:
#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;
}
}
注意:通常不鼓励从 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;
}
}
根据@skypjack 的回答,这是一个模板化版本:
#include<queue>
#include<iostream>
template<class T, class C = vector<T>, class P = less<typename C::value_type> >
struct MyPriorityQueue :
std::priority_queue<T,C,P> {
typename C::iterator begin() { return std::priority_queue<T, C, P>::c.begin(); }
typename C::iterator end() { return std::priority_queue<T, C, P>::c.end(); }
};
int main() {
MyPriorityQueue<int> pq;
pq.push(0);
pq.push(1);
for (auto &v : pq) {
std::cout << v << std::endl;
}
}