📜  如何在 C++ 中的优先级队列中使用比较器功能(1)

📅  最后修改于: 2023-12-03 15:38:13.932000             🧑  作者: Mango

如何在 C++ 中的优先级队列中使用比较器功能

在 C++ 中,我们可以使用优先级队列(Priority Queue)数据结构来实现基于优先级的队列。优先级队列会自动对插入的元素按照优先级进行排序,并且在弹出元素时总是先弹出优先级最高的元素。

默认情况下,优先级队列内部使用 std::less 比较器来进行元素的排序。即如果类型 T 可以使用小于运算符(<)进行比较,则优先级队列会使用 std::less<T> 来进行排序。

但是有时候我们需要自定义比较器来指定元素的排序方法,比如我们可能需要按照某个元素的大小来进行排序,或者需要按照字典序进行排序等。在这种情况下,我们可以通过以下两种方式来自定义比较器。

方式一:使用仿函数

首先,我们可以使用仿函数(Functor)来实现自定义比较器。仿函数是一个重载了函数调用运算符 () 的类,它可以像函数一样被调用。我们可以定义一个仿函数类,并在其中重载 () 运算符来实现自定义的比较逻辑。

struct MyComparator {
    bool operator()(const int& a, const int& b) const {
        return a > b;
    }
};

std::priority_queue<int, std::vector<int>, MyComparator> pq;

上述代码中,我们定义了一个名为 MyComparator 的仿函数类,其中重载了 () 运算符来实现将元素按照从大到小的顺序排序。然后,我们可以将 MyComparator 作为模板参数传递给 std::priority_queue,从而使用我们自定义的比较器。

方式二:使用 Lambda 表达式

除了使用仿函数,我们还可以使用 Lambda 表达式来定义自定义比较器。Lambda 表达式是一种匿名函数,可以在需要的地方直接定义和使用。

auto cmp = [](int a, int b) { return a > b; };
std::priority_queue<int, std::vector<int>, decltype(cmp)> pq(cmp);

上述代码中,我们使用 Lambda 表达式定义名为 cmp 的自定义比较器,其中 [] 中的部分是 Lambda 函数的参数列表,{} 中的部分是 Lambda 函数的主体。我们在主体中使用 return 语句来定义元素的排序逻辑。然后,我们可以使用 decltype 取得 cmp 的类型,并将其作为模板参数传递给 std::priority_queue,从而使用我们自定义的比较器。

通过以上两种方式的其中之一,我们就可以实现在 C++ 中优先级队列中使用自定义的比较器对元素进行排序了。

总结

在 C++ 中,我们可以使用优先级队列数据结构实现基于优先级的队列。如果我们需要自定义比较器来指定元素的排序方法,可以使用仿函数或 Lambda 表达式来实现。这样我们可以灵活地指定元素的排序逻辑,满足不同的业务需求。