当前位置: 首页 > 知识库问答 >
问题:

为什么向量用作优先级队列的第二个参数?

范福
2023-03-14

为什么当priority_queue与单个数据类型(如“int”)一起使用时,我们会这样初始化它:priority_queue

另外,我注意到有几种方法可以添加第三个参数来指定顺序。

方法1-结构

struct myCompare {
   bool operator()(const pair<int, int>& A, const pair<int, int>& B) {
       return A.second < B.second;
   }
};

priority_queue<pair<int, int>, vector<pair<int, int>>, myCompare> leaderBoard;

方法2-Lambda

auto myComp = [](const pair<int, int>& A, const pair<int, int>& B) 
              {return A.second < B.second;};

priority_queue<pair<int, int>, vector<pair<int, int>>, decltype(myComp)> leaderBoard(myComp);

我的问题

  1. 为什么优先级队列的第二个参数是向量?这意味着什么?何时需要指定第二个参数
  2. 在方法2中,为什么这个lambda需要decltype
  3. 在方法2中,为什么需要使用(myComp)
  4. 在方法2中,为什么不能直接将lambda指定为第三个参数
  5. A.second之间有什么区别

共有3个答案

皇甫卓君
2023-03-14
匿名用户

为什么优先级队列的第二个参数是向量?

您可以使用满足特定要求的任何容器<代码>矢量是合理的默认选择。

这是什么意思,什么时候需要指定第二个参数?

如果要更改其默认值,或者要指定第三个值。std::priority_queue

在方法2中,为什么这个lambda需要dectype?

如果要使用自定义比较器,必须将其类型指定为第三个模板参数。每个lambda都有自己独特的类型,获得它的唯一方法是通过dectype

在方法2中,为什么需要用(myComp)初始化对象的领导板?

因为基于struct的比较器可以默认构造,但是基于lambda的比较器不能。相关的建造者是

priority_queue() : priority_queue(Compare(), Container()) { }
priority_queue(const Compare& compare) : priority_queue(compare, Container()) { }

如果不提供compare,则使用compare()myCompare()是有效值,decltype(myComp)(不是有效值。

在方法2中,为什么我不能直接指定我的lambda作为第三个参数?

您需要一个类型,而不是该类型的值。

一秒钟和一秒钟有什么区别

交换参数顺序(或者,等价地,

束帅
2023-03-14

在方法2中,为什么需要用(myComp)初始化对象的领导板?

这取决于你使用什么样的C标准。在C 20之前,您需要将lambda表达式创建的函子传递给priority\u queue构造函数,因为直到C 20之前的lambda都不是默认可构造的。

从C 20开始,您可以编写:

priority_queue<pair<int, int>, vector<pair<int, int>>, decltype(myComp)> leaderBoard;

它将正常工作,因为编译器知道lambda的类型-由dectype(myComp)指定,并且它可以调用它的默认ctor。

在方法2中,为什么我不能直接指定我的lambda作为第三个参数?

是的,你可以,但是你仍然需要使用dectype来获得比较器类型:

priority_queue<pair<int, int>, vector<pair<int, int>>, 
     decltype( [](const pair<int, int>& A, const pair<int, int>& B) 
              {return A.second < B.second;} ) > leaderBoard;
嵇星海
2023-03-14

为什么当priority_queue与单个数据类型一起使用时,比如'int',我们这样初始化它:priority_queue

因为std::priority_queue是一个类模板,定义如下:

template<
    class T,
    class Container = std::vector<T>,
    class Compare = std::less<typename Container::value_type>
> class priority_queue;

如您所见,您可以只提供T来实例化这个类,因为其余类型将被默认。您可以在这里阅读更多关于模板默认参数的信息。

但是,当它用一对进行初始化时,我们添加了第二个vectorpriority\u queue类型的参数

因为有人想直言不讳<代码>优先级队列

  1. 为什么priority_queue的第二个参数是向量?这是什么意思,什么时候需要指定第二个参数?

我们不需要明确地指定它。第二个模板参数是用于数据内部表示的类型。std::priority_queue是一个容器适配器,这意味着它本身不是一个容器——它使用其他容器并用某种实用程序包装它...

因为您需要提供一个类型myCompare是一个struct,因此它是一个类型的名称myComp不是类型,而是变量。是否要获取其声明的类型?使用decltype

因为您不能在给定lambda的decltype的情况下默认构造对象(这在C 20中得到了放松)。您需要使用以下构造函数:

explicit priority_queue(const Compare& compare)
    : priority_queue(compare, Container()) { }

它需要一个可调用的(在本例中为lambda),它将用作比较器。

你的意思是作为第三个模板参数?因为到目前为止,lambda不能在未计算的上下文中使用,为模板提供类型就是其中之一。

5.1. A.second之间有什么区别

差别是相当明显的。一个检查A.second是否大于第二个参数,另一个则相反。它通常用于排序(用于比较元素)。

5.2您如何记住哪个是升序,哪个是降序?

这很简单,C的概念是使用

 类似资料:
  • 我曾尝试在循环加权图上使用Djikstra的算法,而不使用优先级队列(堆),结果成功了。 Wikipedia指出,该算法的原始实现不使用优先级队列,而是在O(V2)时间内运行。 现在,如果我们只删除优先级队列并使用普通队列,则运行时间是线性的,即O(ve)。 有人能解释一下为什么我们需要优先队列吗?

  • 所以我的问题是为什么not Queue比list更受欢迎。我相信一定有某种原因,但不知何故,我错过了这种理解? 更新:-这是我明确的要求 1)加法发生在末尾,应该很快。可能是O(1) 3)由于查找将基于om索引进行,因此两者都将是O(1)

  • 本文向大家介绍什么是Java优先级队列(Priority Queue)?相关面试题,主要包含被问及什么是Java优先级队列(Priority Queue)?时的应答技巧和注意事项,需要的朋友参考一下 考察点:队列 PriorityQueue是一个基于优先级堆的无界队列,它的元素是按照自然顺序(natural order)排序的。在创建的时候,我们可以给它提供一个负责给元素排序的比较器。Priori

  • 我需要一个优先级队列,它首先获得具有最高优先级值的项目。我当前正在使用队列库中的PriorityQueue类。但是,这个函数只先返回值最小的项。我尝试了一些很难看的解决方案,比如(sys.maxint-priority)作为优先级,但我只是想知道是否存在更优雅的解决方案。

  • 我不熟悉堆,二进制堆,我试图理解为什么我们需要使用二进制堆实现优先级队列。我还了解到二进制堆的底层数据结构也是一个数组。 所以我的问题是,为什么我们不能使用一个数组,按降序(对于最大堆)或升序(对于最小堆)排序来表示优先级队列?这里我可能错了,但我认为,如果以这种方式实现,findMax、findMin、insert和delete等操作的时间复杂度将几乎保持不变。那么,我们是否可以不使用排序数组来

  • 我试图实现Dijkstra算法的一个版本,以找到公共汽车从起点到终点的最短路线。不幸的是,我似乎找不到swift提供优先级队列类型的库或其他方式,所以我似乎必须自己编写代码。 话虽如此,有人能指出我做这件事的正确方向吗? 目前我的想法如下: 到目前为止这是我的代码。似乎太短太残忍了...我一定是在概念上漏掉了什么。