使用自定义比较函数将优先级队列声明为类中的私有成员的正确方法是什么?

问题描述 投票:0回答:1

假设我有一个 C++ 课程:

struct CompareTuple
{
public:
    auto operator() (const Tuple& t1, const Tuple& t2) -> bool 
    {
        // do comparison and return
    }
};

class Foo 
{
public:
    // some functions
private:
    std::priority_queue<Tuple, std::vector<Tuple>, CompareTuple> heap_;
};

struct CompareTuple
是现代C++中的正确方法吗? 如果不是,那么以现代方式在优先级队列中定义自定义比较函数的正确方法是什么? 因为我明白了,我们可以使用 lambda。但我不知道如何在
.h
文件中与
class Foo
一起定义。

我已经尝试过上面展示的示例,它有效。但我想知道这是否是 C++20 中最好的方法。

c++ lambda c++20 priority-queue functor
1个回答
2
投票

您应该考虑在

operator<
本身中提供
Tuple
,默认情况下可以比较
Tuple
。如果这不是为调用方设计的,您可以选择使用函子或 lambda 函数。


这个结构

CompareTuple
是现代C++中的正确方法吗?

函子是古老但黄金的工具,它在任何地方都适用。因此,它在现代(IMO)中仍然具有相关性,并且无需担心如果选择使用它,您的代码将会过时。


在现代 C++ 的优先级队列中定义自定义比较函数的正确方法是什么?因为我发现我们可以使用 lambda [...]

是的,确实,您可以使用 lambda 作为替代方案。这些都是方便的工具(自 起),通过它们,人们可以避免编写可以说是冗长的函子,以及未命名函数对象(又名 lambda)的定义,在需要的地方(可能只需要一次) .

例如,使用c++14中的,以及在未评估上下文中默认可构造 lambda(自 起)的支持,可以这样做:

class Foo
{
private:
    // Using lambda function as a custom comparison
    std::priority_queue<Tuple, std::vector<Tuple>,
        decltype([](const auto& lhs, const auto& rhs) {
        return lhs.mX > rhs.mX; //  define the priority as per!
            }) > heap;
public:
   // .... code
};

请参阅 godbolt.org 中的演示


C++20之前,需要两个步骤:

class Foo
{
private:
    // Captureless lambda as a custom comparison, stored in a function pointer
    bool(*Compare)(const Tuple&, const Tuple&) = [](const Tuple& lhs, const Tuple& rhs){
        return lhs.mX > rhs.mX; //  define the priority as per!
    };
    std::priority_queue<Tuple, std::vector<Tuple>, decltype(Compare)> heap{Compare};

public:
    // .... code
};
© www.soinside.com 2019 - 2024. All rights reserved.