C++ 如何使用自定义比较器声明 priority_queue 的数组

C++ how to declare an array of priority_queue with customed comparator

想法来自: declaring a priority_queue in c++ with a custom comparator ,

我尝试使用 lambda 作为 priority_queue 的比较器,但是当我尝试声明它的数组时,出现错误。

代码:

`

class Klass{public:int raw_hash;int name;};

bool PriorByRaw(Klass a, Klass b){return a.raw_hash > b.raw_hash;}

auto prior = [](Klass a, Klass b){return PriorByRaw(a, b);};

//here comes the error before "[10]": expected a ';'

priority_queue<Klass, vector<Klass>, decltype(prior)> pq(prior)[10];

`

问题是如何以这种方式声明 priority_queue 的数组?或者还有其他解决方案吗? 有一天我可能需要一个优先级查询,它使用其他函数作为比较器(比如“PriorByName”),覆盖“Klass”的 less 函数看起来不太好。

我尝试过但没有成功:

priority_queue<Klass, vector<Klass>, decltype(prior)> pq(prior)[10];

priority_queue<Klass, vector<Klass>, decltype(prior)> (pq(prior))[10];

您可以执行以下操作来实现您想要的:

bool PriorByRaw(Klass const & a, Klass const & b) { return a.raw_hash > b.raw_hash; }

class KlassCompare
{
public:
    bool operator() (Klass const & a, Klass const & b) const
    {
        return PriorByRaw(a, b);
    }
};
priority_queue<Klass, vector<Klass>, KlassCompare> pq[10];

几条评论:

  1. 我用 const& 代替了按值传递 Klass 对象,因为这样效率更高。你有什么理由按价值传递它吗?

  2. 主要问题是用比较器 class 和 operator() 替换 lambda。使用 lambda 和 decltype(prior) 需要编译器构造一个新的 lambda 实例,这是不允许的。 MSVC 给出以下使用 lambda 的错误:

    “错误 C3497:您无法构造 lambda 的实例”

    如果您想了解更多信息,可以查看C3497