我试图解决一个编码问题,该问题要求我使用堆来获取特定顺序的项目。当我尝试使用自定义的priority_queue和make_heap来实现解决方案时,我发现我们在自己的比较器中传递的方式是不同且令人困惑的。
c ++。com说:
priority_queue (const Compare& comp = Compare(), const Container& ctnr = Container());
Comp是用于对堆进行排序的比较对象。这可能是一个函数指针或函数对象,可以通过比较两个参数来执行严格的弱排序。
void make_heap (RandomAccessIterator first, RandomAccessIterator last,
Compare comp );
这里comp是一个二进制函数,它接受范围内的两个元素作为参数,并返回可转换为bool的值。这可以是一个函数指针或一个函数对象。
当我尝试实现代码时,我对2 comp的用法区别感到困惑。
// first I define a functor and a static function, both used to be passed as the comp argument;
class isGreater {
public:
isGreater() {}
inline bool operator() (const ListNode* l1, const ListNode* l2) const {
return l1->val >= l2->val;
}
};
static bool isLarger(const ListNode* l1, const ListNode* l2) {
return l1->val >= l2->val;
}
// then I tried several ways to define a custom pq and heap:
// correct
priority_queue<ListNode*, std::vector<ListNode*>, isGreater> p;
// wrong, error: data member instantiated with function type
// 'value_compare'(aka 'isGreater ()')
priority_queue<ListNode*, std::vector<ListNode*>, isGreater()> p;
// wrong, passing a function pointer like this is not allowed
// error: template argument for template type parameter must be a type
priority_queue<ListNode*, std::vector<ListNode*>, isLarger> p;
// correct
make_heap(v.begin(), v.end(), isGreater());
// correct, here passing a function pointer like this is allowed
make_heap(v.begin(), v.end(), isLarger);
// wrong, the "()" is needed, different from how we define priority queue
make_heap(v.begin(), v.end(), isGreater);
我对我们将comp作为参数传递方式的不同感到困惑。有人能帮助我解决这个难题吗?
最佳答案
为了了解发生了什么,您需要了解isGreater
和isGreater()
之间的区别isGreater
是类型的名称。它可以到达类型可以到达的地方,即进入模板参数(三角括号)和声明。isGreater()
是构造函数调用,它生成类型为isGreater
的对象。它可以放在表达式可以到达的任何地方,例如它可以用作函数参数。
现在,错误应该已经清除:不允许使用类型名称isGreater
代替对象表达式isGreater()
,反之亦然。