以下是合并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?
它可以是struct
或class
。它们本质上是相同的东西,除了1. struct
的成员是默认的public
和class
的成员是默认的private
,以及2.人们应该如何将struct
s用于POD(普通旧数据)和class
es的一般观点其他。
“运算符”之后的“()”是什么?
这很有趣。 ... operator()(...)
定义函数调用运算符的重载。每当调用函数时,您一定会使用此运算符,将参数封装在方括号内,并使返回值成为表达式的结果。
另外,通常将带有重载函数调用运算符的class
或struct
称为functor
。
为什么使用“>”而不是“
这也是另一个有趣的问题。这个想法是 STL(标准模板库)旨在供几乎所有使用C++的人使用,并为执行某些操作提供方便。这样,STL中的所有工具都可以针对任何类型(包括用户定义的类型)使用。
但是,用户定义的类型默认没有重载<
和>
这样的运算符,因此用户将不得不重载它们。a > b
的结果与b < a
基本上相同。现在想象一下,其中一些工具是否使用<
,而其他工具使用>
。每个人都必须重载两个运算符,即使它们只是彼此的补充,并且可以用来替代彼此。
因此,设置了一个标准,使STL仅使用>
运算符,并且仅要求您重载该一个运算符。
附带说明一下,您可以使用std::less模板化函子来进行简单的操作(例如小于比较),而使用std::function来进行更复杂的操作,而不是编写自己的比较函子。
感谢您的阅读。
关于c++ - 比较器在C++中的用法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26491619/