以下是合并k个排序列表的c++代码。但是我很困惑阅读前四行代码。我知道它的作用只是混淆它的作用。有人可以向我解释这些话吗?

为什么要使用struct?
“运算符”之后的“()”是什么?
由于包括结果列表在内的所有列表都是按升序排列的,为什么要使用“>”而不是“

struct compare {
    bool operator() (ListNode* &left, ListNode* &right) {
        return left->val > right->val;
    }
};

class Solution {
public:
    ListNode *mergeKLists(vector<ListNode *> &lists) {
        priority_queue<ListNode *, vector<ListNode *>, compare> heap;
        for (int i = 0; i < lists.size(); i++) {
            if (lists[i]) heap.push(lists[i]);
        }
        ListNode *dummy = new ListNode(0);
        ListNode *cur = dummy;
        while (!heap.empty()) {
            ListNode *min = heap.top();
            heap.pop();
            cur->next = min;
            cur = min;
            if (min->next) {
                heap.push(min->next);
            }
        }
        return dummy->next;
    }
};

最佳答案

为什么使用struct?

它可以是structclass。它们本质上是相同的东西,除了1. struct的成员是默认的publicclass的成员是默认的private,以及2.人们应该如何将struct s用于POD(普通旧数据)和class es的一般观点其他。

“运算符”之后的“()”是什么?

这很有趣。 ... operator()(...)定义函数调用运算符的重载。每当调用函数时,您一定会使用此运算符,将参数封装在方括号内,并使返回值成为表达式的结果。

另外,通常将带有重载函数调用运算符的classstruct称为functor

为什么使用“>”而不是“

这也是另一个有趣的问题。这个想法是 STL(标准模板库)旨在供几乎所有使用C++的人使用,并为执行某些操作提供方便。这样,STL中的所有工具都可以针对任何类型(包括用户定义的类型)使用。

但是,用户定义的类型默认没有重载<>这样的运算符,因此用户将不得不重载它们。
a > b的结果与b < a基本上相同。现在想象一下,其中一些工具是否使用<,而其他工具使用>。每个人都必须重载两个运算符,即使它们只是彼此的补充,并且可以用来替代彼此。

因此,设置了一个标准,使STL仅使用>运算符,并且仅要求您重载该一个运算符。

附带说明一下,您可以使用std::less模板化函子来进行简单的操作(例如小于比较),而使用std::function来进行更复杂的操作,而不是编写自己的比较函子。

感谢您的阅读。

关于c++ - 比较器在C++中的用法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26491619/

10-11 23:02
查看更多