具有自定义比较器和 O(n) 时间的 priority_queue c++
Posted
技术标签:
【中文标题】具有自定义比较器和 O(n) 时间的 priority_queue c++【英文标题】:priority_queue c++ with custom comparator and O(n) time 【发布时间】:2021-06-16 20:48:03 【问题描述】:我正在搜索,但没有找到使用自定义比较器创建 priority_queue 的简单方法,但这也需要线性时间来创建 priority_queue 中的元素。
可以使用以下方法在线性时间内创建一个priority_queue:
vector<int> arr = 1,2,3,4;
priority_queue<int> pq(arr.begin(),arr.end());
并且可以使用自定义比较器创建一个priority_queue
auto cmp = [](int p1, int p2)return p1<p2;
priority_queue<int,vector<int>,decltype(cmp)> pq(cmp);
我想知道是否可以这样做:
priority_queue<int,vector<int>,decltype(cmp)> pq(cmp,points.begin(),points.end());
因为如果我使用自定义比较器创建 priority_queue 并使用 push 插入值后,时间复杂度将为 O (nlg (n))
【问题讨论】:
我不明白这个问题。您可以在此处查看可用构造函数的列表:en.cppreference.com/w/cpp/container/priority_queue/…,没有一个比线性更糟糕 你是什么意思“如果可能的话”?您在尝试时遇到任何问题吗? 可以使用自定义比较器创建一个priority_queue,也可以在线性时间内将元素插入到priority_queue中,但是我搜索了很多,我没有找到使用a的方法自定义比较器,并在线性时间内创建优先级队列 您发布的使用元素和自定义比较器调用构造函数的代码有什么问题?它不会编译吗? 我认为您正在上面的链接中寻找 (13)。您只是将参数按错误的顺序排列。你用的是什么参考?不可能记住所有这些细节,猜测也不行。 【参考方案1】:假设points
是一个包含std::vector<int>
s 的容器,您可以这样定义优先级队列:
std::priority_queue<std::vector<int>,
std::vector<std::vector<int>>,
decltype(cmp)> pq(points.begin(), points.end(), cmp);
Demo
【讨论】:
你应该可以在不指定模板的情况下直接调用std::priority_queue pq(points.begin(), points.end(), cmp)
。
`@Ranoiaetep 是的,绝对是。这也有效。以上是关于具有自定义比较器和 O(n) 时间的 priority_queue c++的主要内容,如果未能解决你的问题,请参考以下文章