STL可迭代容器,如priority_queue
STL iterable container like priority_queue
我是STL容器(和c++)的新手,所以我想我应该向社区寻求帮助。我想要一个支持常数迭代的priority_queue
。现在,std::priority_queue
似乎不支持迭代,所以我将不得不使用其他东西,但我不确定确切是什么。
要求:
- 在插入时保持顺序(类似于优先级队列)
- 从列表顶部弹出
- 获取对列表中每个元素的const访问权限(在此阶段不关心队列中的顺序)
一种选择是保留一个priority_queue
,并单独拥有一个unordered_set
的引用,但我不希望有两个容器浮动。我也可以使用deque
并搜索正确的插入位置,但如果可能的话,我宁愿让容器为我管理排序(并且恒定时间插入将比线性时间更好)。有什么建议吗?
我想到了两个选项:
1)使用std::vector
和堆操作算法实现自己的可迭代优先级队列(参见堆操作)。
2) private from priority_queue
。这使您可以通过数据成员c
访问底层容器。然后可以在公共接口中公开迭代、随机访问和其他感兴趣的方法。
使用std::vector可能就像其他人已经指出的那样足够了,但是如果您想要已经准备好的实现,也许可以使用Boost。堆(这是一个具有多个优先级队列容器的库):http://www.boost.org/doc/libs/1_53_0/doc/html/heap.html
Boost是一个库的集合,基本上完成了标准库(不是很大)。许多c++开发人员在他们的开发计算机上已经准备好了boost,以便在需要时使用它。只是在选择库时要小心。
您可以使用(ordered) set作为队列。Set.begin()将是你的顶部元素,你可以通过erase(Set.begin())弹出它。
您观察过堆(std::make_heap)吗?它在队列内部没有顺序,但有你需要的优先级"pop from top of list"
- 为什么这个 std::queue/指向结构的指针列表直到 List.Size() == 0 才释放内存?
- 将参数打包的参数传递到 std::queue 中,以便稍后使用不同的函数调用
- C++ queue.front();为什么不从第一个元素开始呢?
- 我可以擦除 std::queue 中间的节点吗?
- 获取大小时是否必须锁定 std::queue?
- 为什么我会收到"invalid conversion from 'Queue*/Stack*' to 'int'"错误消息?
- 销毁 std::queue 会导致内存错误
- 如何将一个 std::queue 的内容附加到另一个
- 使用元素加载 std::queue<uint8_t*> 的更有效方法?
- 为什么 std::queue 没有实现 insert() 而 std::d eque 实现了?
- 带有 std::vector 和 std::queue 的 Prim's 算法,我的代码有什么问题?
- C++程序在 #include 时无法编译<stack>,#include<queue>
- 是boost :: lockfree :: Queue(在多线程程序中)可锁定
- std :: queue :: pop()在其std :: unique_ptr数据上操作
- 通过 std::queue 中的元素的值获取元素的索引
- 如何索引指向数组 [queue] 的指针数组
- 像std::queue这样的c++标准库容器是否保证是可重入的
- 如何使用"priority"进行多线程处理?
- 在 boost::lockfree:queue 默认构造函数的情况下断言失败
- C++ Floating-Point van Emde Boas (vEB) Priority Queue