C+中比较器的使用+; 以下是将K排序列表合并的C++代码。但我在阅读前4行代码时感到困惑。我知道它是干什么的,只是搞不清楚它是怎么干的。谁能给我解释一下这些台词吗
为什么要使用struct? “operator”后面的“()”是什么意思?C+中比较器的使用+; 以下是将K排序列表合并的C++代码。但我在阅读前4行代码时感到困惑。我知道它是干什么的,只是搞不清楚它是怎么干的。谁能给我解释一下这些台词吗,c++,C++,为什么要使用struct? “operator”后面的“()”是什么意思? 为什么使用“>”而不是“你的结构比较就是所谓的函子或函数对象 它可以像函子一样使用。(在后台,如果你给它一个lambda表达式,编译器很可能会创建一个函子。)为什么要使用struct 这里没有必要使用struct,尽管它不会造成伤害 “operator”后面的“()”是什么意思 寻找操作符重载教程 为什么使用“>”而不是“为什么使用struct? 它可以是结构或类。它们本质上是相同的东西,而不是1。structs的成员是
为什么使用“>”而不是“你的
结构比较
就是所谓的函子或函数对象
它可以像函子一样使用。(在后台,如果你给它一个lambda表达式,编译器很可能会创建一个函子。)为什么要使用struct
这里没有必要使用struct,尽管它不会造成伤害
“operator”后面的“()”是什么意思
寻找操作符重载教程
为什么使用“>”而不是“为什么使用struct? 它可以是
结构
或类
。它们本质上是相同的东西,而不是1。struct
s的成员是默认的public
,class
es的成员是默认的private
,2。关于人们应该如何将struct
s用于POD(普通旧数据)和class
es用于其他所有内容的一般意见
运算符后面的“()”是什么意思?
这个很有趣<代码>。。。操作符()(…)为函数调用操作符定义重载。无论何时调用函数,都肯定会使用此运算符,将参数封装在括号内,并将返回值作为表达式的结果
另一方面,带有重载函数调用运算符的类
或结构
通常称为函子
为什么要使用“>”而不是“可能重复的@aruistante:不在这里。嘎,我不是真的想关闭,我只是用它来搜索链接,因为它解释了您问题的第1部分(关于
操作符()
).Thecompare
结构的sol用途是定义运算符重载,本质上使其成为函数对象。关于第2部分,它改变了排序顺序。1)命名变量min
不是一个好主意。2)代码中的一个电流表明ListNode*dummy=new ListNode(0)上存在内存泄漏
。我看不出你将指针值保存在哪里,以备将来使用删除
-ion。那么我需要对2做些什么?)@NeilKirk很公平,但这意味着,我们不应该只传递这些指针(正如你在回答中提到的),或者让调用方取消引用并按引用传递(这是我更喜欢的)。在这两种情况下,它们都应该是const
限定的。OP想要比较类型ListNode*
,因此我认为const
在这里不合适。可以使用ListNode*
或const
引用它(ListNode*const&
)@anatolyg,他可以将它们作为const ListNode*
进行比较,所以我看不出这里的问题。比较函数不会改变指向.Thx的对象。为什么…operator()(…)不表示任何运算符(><=)?@user3692521,因为该运算符正是()@user3692521a==ba.operator==(b)
,a>ba.operator>(b)
,因此a(b)
=>a.operator()(b)
。请注意,这只适用于用户定义的类型,并不描述内置类型上的运算符的行为。
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 compare
{
bool
operator() (const ListNode& left, const ListNode& right) const
{
return left.val > right.val;
}
};
void
example_usage(const ListNode& left, const ListNode& right, const compare cmp)
{
if (cmp(left, right))
std::cout << "left is greater" << std::endl;
else
std::cout << "right is greater" << std::endl;
}
auto cmp = [](const ListNode& left, const ListNode& right)->bool{
return left.val > right.val;
};