标签: priority-queue

C++中是否有一个支持更改除head之外的元素优先级的堆类?

我有一个事件的优先级队列,但有时事件优先级会改变,所以我想将事件请求者的迭代器维护到堆中.如果优先级发生变化,我希望在log(n)时间内调整堆.我将始终只有一个指向堆中每个元素的迭代器.

c++ heap boost stl priority-queue

12
推荐指数
2
解决办法
3423
查看次数

Delphi的线程安全优先级队列?

我正在寻找一个在Delphi中实现的优先级队列,它在多线程环境中运行良好.

理想情况下无锁,或设计用于多线程插入/删除,其中包含比单线程实现(我已经拥有)的锁定包装更好的东西.

特殊性在于,在正常操作中,当顶部(最高优先级项)改变时,将仅存在添加,删除和通知,而最高优先级项的"弹出"操作应该非常罕见.

它将用于监视/超时线程监视任务,在其他线程中执行,这些任务预计在大多数时间内正常终止,因此它们只是从队列中添加/删除.超时线程基本上会等待下一个超时事件,因此在最高优先级事件发生更改时需要通知.

任务由脚本处理,可以随时安全地终止.

如果有比这更好的算法而不是优先级队列,它们也可能是很好的答案!

编辑:在Martin James的评论之后,另一个特点是相对较少的不同超时值,并且对于每个超时值,问题变成FIFO队列的问题.

delphi priority-queue thread-safety

12
推荐指数
1
解决办法
2681
查看次数

如何使用用户定义的对象从priority_queue获取非const顶级元素?

std :: priority_queue :: top返回一个常量值.但是,我想从优先级队列中删除顶部元素,并能够在其他地方修改它.

priority_queue<SomeClass, vector<SomeClass>, SomeClassCompare > pQueue;
...
SomeClass *toBeModified = &(pQueue.top());
pQueue.pop();
toBeModified->setMember(3); // I would like to do this
Run Code Online (Sandbox Code Playgroud)

有没有办法可以从优先级队列中获取顶级元素(并从队列中删除)并按照我的意愿修改它?

c++ const priority-queue c++11

12
推荐指数
1
解决办法
4493
查看次数

std :: priority_queue中的比较器

有没有理由让std::priority_queue构造函数通过常量引用接受比较器?如果比较器超出范围怎么办?

在@LightnessRacesInOrbit指出的可能移动比较器的情况下,我正在考虑这个问题!

如果已有关于此事的帖子,我很抱歉.我一直都找不到它!

c++ heap stl priority-queue c++11

12
推荐指数
2
解决办法
568
查看次数

如何获得priority_queue的比较类型?

最相似的容器有会员类型,如key_comparevalue_compare但有没有priority_queue.

是因为priority_queue是适配器吗?或者这是错误的标准?

c++ priority-queue c++-standard-library language-lawyer

12
推荐指数
1
解决办法
146
查看次数

空间有限的优先级队列:寻找一个好的算法

这不是作业.

我正在使用一个小的"优先级队列"(目前实现为数组)来存储具有最小值的最后N个项目.这有点慢 - O(N)项目插入时间.当前实现跟踪数组中的最大项并丢弃任何不适合数组的项,但我仍希望进一步减少操作数.

寻找符合以下要求的优先级队列算法:

  1. queue可以实现为数组,它具有固定的大小和_cannot_ grow.严禁在任何队列操作期间进行动态内存分配.
  2. 任何不适合数组的东西都会被丢弃,但是队列会保留所有遇到的最小元素.
  3. O(log(N))插入时间(即将元素添加到队列中应占用O(log(N))).
  4. (可选)O(1)访问队列中最大*项目(队列存储*最小*项目,因此最大项目将首先被丢弃,我需要它们来减少操作次数)
  5. 易于实施/理解.理想情况下 - 类似于二元搜索的东西 - 一旦你理解它,你就会永远记住它.
  6. 元素无需以任何方式排序.我只需要保持N遇到的最小值.当我需要它们时,我会立刻访问它们.所以从技术上讲,它不必是一个队列,我只需要存储N个最后的最小值.

我最初考虑使用二进制堆(它们可以通过数组轻松实现),但显然当数组不能再增长时它们表现不佳.链接列表和数组将需要额外的时间来移动东西.stl优先级队列增长并使用动态分配(尽管我可能错了).

那么,还有其他想法吗?

--EDIT--
我对STL实现不感兴趣.由于大量的函数调用,STL实现(由少数人建议)比当前使用的线性阵列慢一点.

我对优先级队列算法感兴趣,而不是实现.

c++ algorithm queue priority-queue

11
推荐指数
2
解决办法
6571
查看次数

是使用std :: deque还是std :: priority_queue线程安全?

可能重复:
C++ STL std :: set是否是线程安全的?
STL队列的线程安全性

我猜它不是,我只想确定.意思是2个线程使用相同的 std :: deque std::deque::push_backpush_front同时使用.

同样的问题std::priority_queue和功能std::priority_queue::pushstd::priority_queue::pop..

这些容器是否是线程安全的?或者我应该亲自编程它是线程安全的?

Tnx很多.

c++ stl priority-queue thread-safety deque

11
推荐指数
1
解决办法
2万
查看次数

STL堆栈和priority_queue的插入器

std::vector,std::list并且std::dequestd::back_inserterstd::setstd::inserter.

对于std::stackstd::priority_queue我会假设等效的插入器将是一个,push()但我似乎无法找到正确的函数来调用.

我的意图是能够使用以下函数和正确的插入迭代器:

#include <string>
#include <queue>
#include <iterator>

template<typename outiter>
void foo(outiter oitr)
{
   static const std::string s1 ("abcdefghji");
   static const std::string s2 ("1234567890");
   *oitr++ = s1;
   *oitr++ = s2;
}

int main()
{
   std::priority_queue<std::string> spq;
   std::stack<std::string> stk;

   foo(std::inserter(spq));
   foo(std::inserter(stk));

   return 0;
}
Run Code Online (Sandbox Code Playgroud)

c++ containers stl priority-queue inserter

11
推荐指数
2
解决办法
1240
查看次数

用户定义类型的优先级队列

我有以下结构

struct node{
   float val;
   int count;

}
Run Code Online (Sandbox Code Playgroud)

我有这个结构的几个对象.现在,我想将这些对象插入到STL的优先级队列中,以便优先级队列按计数对项目进行排序.有关如何这样做的任何想法?优选地,最小堆是优选的.我知道如何对原始数据类型而不是结构进行上述操作

c++ priority-queue min-heap

11
推荐指数
3
解决办法
3万
查看次数

与 GCC 5 相比,使用 GCC 9 编译的 STLpriority_queue 性能较慢

对于我的项目,我从 GCC 5 切换到 GCC 9,发现性能变得更差。我做了一些调查并提出了一个简单的源代码来重现该行为。

我在同一台机器上使用不同的 GCC 版本(g++-5 和 g++-9)编译代码

#include <queue>

int main()
{
        std::priority_queue<int> q;
        for (int j = 0; j < 2000; j ++) {
                for (int i = 0; i < 20000; i ++) {
                        q.emplace(i);
                }
                for (int i = 0; i < 20000; i ++) {
                        q.pop();
                }
        }
        return 0;
}
Run Code Online (Sandbox Code Playgroud)

当我使用 GCC 5 编译它时,我得到以下计时:

# g++-5 -std=c++14 -O3 main.cpp
# time ./a.out

real    0m1.580s
user    0m1.578s
sys     0m0.001s
Run Code Online (Sandbox Code Playgroud)

对 GCC 9 …

c++ performance gcc priority-queue compiler-optimization

11
推荐指数
1
解决办法
312
查看次数