【问题标题】:priority_queue c++ with custom comparator and O(n) time具有自定义比较器和 O(n) 时间的 priority_queue c++
【发布时间】: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)。您只是将参数按错误的顺序排列。你用的是什么参考?不可能记住所有这些细节,猜测也不行。

标签: c++ constructor find c++17 priority-queue


【解决方案1】:

假设points 是一个包含std::vector&lt;int&gt;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 是的,绝对是。这也有效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-13
  • 1970-01-01
  • 1970-01-01
  • 2011-05-10
  • 2018-04-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多