我试图解决一个编码问题,该问题要求我使用堆来获取特定顺序的项目。当我尝试使用自定义的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作为参数传递方式的不同感到困惑。有人能帮助我解决这个难题吗?

最佳答案

为了了解发生了什么,您需要了解isGreaterisGreater()之间的区别


isGreater是类型的名称。它可以到达类型可以到达的地方,即进入模板参数(三角括号)和声明。
isGreater()是构造函数调用,它生成类型为isGreater的对象。它可以放在表达式可以到达的任何地方,例如它可以用作函数参数。


现在,错误应该已经清除:不允许使用类型名称isGreater代替对象表达式isGreater(),反之亦然。

07-24 14:04