《STL源码分析》中如何priority_queue使用greater函数对象?
explicit priority_queue(const Compare& x) : c() , comp(x) {}的构造函数。
为什么不能使用上述的构造函数 来定义对象的比较函数对象?例如对 int 型队列,为什么不能用
priority_queue<int> q1(greater<int>);
来定义小根堆,而必须是:
priority_queue<int, vector<int>, greater<int> > q1; 展开
首先查看手册,priority_queue的定义如下:
template<class T, class Container = std::vector<T>, class Compare = std::less<typename Container::value_type>> class priority_queue;
然后继续看模板的三个参数的说明
—————————以下直接摘抄的—————
Template parameters
T - The type of the stored elements. The behavior is undefined if T is not the same type asContainer::value_type. (since C++17)
Container - The type of the underlying container to use to store the elements. The container must satisfy the requirements of SequenceContainer, and its iterators must satisfy the requirements of LegacyRandomAccessIterator. Additionally, it must provide the following functions with the usual semantics:
front()
push_back()
pop_back()
The standard containers std::vector and std::deque satisfy these requirements.
Compare - A Compare type providing a strict weak ordering.
—————————以上直接摘抄的—————
故可知,使用priority_queue需要给三个类来实现模板,其中第三个类就是那个比较函数,你问的,为什么要priority_queue<int, vector<int>, greater<int> > q1;已经回答完毕。
另外,可以参考std::less的定义,更深入学习第三个类的含义。已附在引用部分,自行查阅。
PS:第一个那家伙回答的什么东西!我本来是不想回答的。。。看见那家伙胡诌一气,气不过。
您好,我想知道优先级队列的第二个构造函数(上图中红色框标识出来的)应该如何使用?能否在声明一个优先级队列的时候,把函数符greator作为参数,传递给对象,改变其默认的 Compare?
A priority_queue keeps internally a comparing function and a container object as data. The comparing function is a copy of comp and the underlying container depends on the constructor used:
(1) initialization constructor
The underlying container is a copy of ctnr, sorted by the make_heap algorithm.
宿主类型成员是复制Comparetor,然后用建堆的算法排序。也就是说,比较函数的设定是在优先队列的类模板中给出的。而优先队列的构造函数只有
默认构造函数,2.复制构造函数,3.初始内容的构造函数
以下举个例子,对上面三种构造函数的引用
所以,不存在你说的,用Comparetor来构造对象
另,给出的手册上的例子不错,可以看看