为什么当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);
我的问题
为什么优先级队列的第二个参数是向量
?这意味着什么?何时需要指定第二个参数
在方法2中,为什么这个lambda需要decltype
在方法2中,为什么需要使用(myComp)
- 在方法2中,为什么不能直接将lambda指定为第三个参数
A.second之间有什么区别
匿名用户
为什么优先级队列的第二个参数是向量?
您可以使用满足特定要求的任何容器<代码>矢量是合理的默认选择。
这是什么意思,什么时候需要指定第二个参数?
如果要更改其默认值,或者要指定第三个值。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作为第三个参数?
您需要一个类型,而不是该类型的值。
一秒钟和一秒钟有什么区别
交换参数顺序(或者,等价地,
在方法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;
为什么当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
来实例化这个类,因为其余类型将被默认。您可以在这里阅读更多关于模板默认参数的信息。
但是,当它用一对进行初始化时,我们添加了第二个vector
priority\u queue类型的参数
因为有人想直言不讳<代码>优先级队列
为什么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提供优先级队列类型的库或其他方式,所以我似乎必须自己编写代码。 话虽如此,有人能指出我做这件事的正确方向吗? 目前我的想法如下: 到目前为止这是我的代码。似乎太短太残忍了...我一定是在概念上漏掉了什么。