以相反的顺序遍历现有的标准优先级队列

Posted

技术标签:

【中文标题】以相反的顺序遍历现有的标准优先级队列【英文标题】:Traverse existing std priority queue in reverse order 【发布时间】:2021-07-02 13:11:34 【问题描述】:

我正在使用 std::priority 队列对象开发一个 c++ 项目。我希望在代码的某个点以相反的顺序(从底部到顶部)访问优先级队列,我天真的解决方案是将所有元素弹出一个新数组并以相反的顺序存储它们。 我想知道是否有更优化的方式以相反的顺序遍历优先级队列?

【问题讨论】:

priority_queue 使用的容器是 protected,因此您可以扩展 priority_queue 类并使用它的容器做您想做的事情。 【参考方案1】:

std::priority_queue 不是容器,它是容器适配器。如果要观察元素,最好的方法是对其进行子类化并暴露底层容器的成员。

template<class T, class Container = std::vector<T>, class Compare = std::less<typename Container::value_type>> 
class my_priority_queue : std::priority_queue<T, Container, Compare> 
    using priority_queue::priority_queue;
    typename Container::const_iterator begin() const  return c.begin(); 
    typename Container::const_iterator end() const  return c.end(); 
    typename Container::const_reverse_iterator rbegin() const  return c.rbegin(); 
    typename Container::const_reverse_iterator rend() const  return c.rend(); 
;

【讨论】:

感谢@Caleth,但代码仍然存在编译问题,/tmp/lpaTtDhkeM.cpp:9:63: error: 'c' was not declared in this scope 9 |类型名 Container::const_iterator begin() const return c.begin();

以上是关于以相反的顺序遍历现有的标准优先级队列的主要内容,如果未能解决你的问题,请参考以下文章

无向图的广度优先遍历算法(bfs)

优先队列

Java集合与数据结构 优先级队列堆

Java集合与数据结构 优先级队列堆

Java集合与数据结构 优先级队列堆

怎样实现广度优先遍历(BFS)