在 C 中为优先级队列声明自定义比较器
在 C 中使用优先级队列时,必须利用自定义比较器来定义对元素进行优先级排序的逻辑。然而,使用自定义比较器声明优先级队列有时会产生错误。
当声明尝试使用比较器函数作为模板参数中的类型名称时,就会发生这样的错误。例如,如果您有一个比较器函数 bool Compare(Node a, Node b) 并且您将优先级队列声明为:
<code class="cpp">priority_queue<Node, vector<Node>, Compare> openSet;</code>
您将遇到错误“Compare”不是类型名称。此错误源于将 Compare 函数名称错误地用作类型。指定比较器的正确方法是将其包含在内联 lambda 函数中或创建一个重载运算符() 的类。
要使用内联 lambda 函数说明解决方案,您可以将声明重写为:
<code class="cpp">priority_queue<Node, vector<Node>, std::function<bool(Node, Node)>> openSet([](Node a, Node b){ return a.compareTo(b); });</code>
或者,您可以为比较器创建一个类并重载运算符(),如下所示:
<code class="cpp">class Compare { public: bool operator()(Node a, Node b){ return a.compareTo(b); } }; priority_queue<Node, vector<Node>, Compare> openSet;</code>
确保比较器类/函数满足 std::function< ;布尔(节点,节点)>签名,代码应该可以成功编译。这种方法可确保使用自定义比较器正确声明优先级队列,使您能够根据定义的逻辑有效地确定元素的优先级。
以上是如何在 C 中使用自定义比较器正确声明优先级队列以避免错误?的详细内容。更多信息请关注PHP中文网其他相关文章!