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];
几条评论:
我用 const&
代替了按值传递 Klass
对象,因为这样效率更高。你有什么理由按价值传递它吗?
主要问题是用比较器 class 和 operator()
替换 lambda。使用 lambda 和 decltype(prior)
需要编译器构造一个新的 lambda 实例,这是不允许的。
MSVC 给出以下使用 lambda 的错误:
“错误 C3497:您无法构造 lambda 的实例”
如果您想了解更多信息,可以查看C3497
。
想法来自: 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];
几条评论:
我用
const&
代替了按值传递Klass
对象,因为这样效率更高。你有什么理由按价值传递它吗?主要问题是用比较器 class 和
operator()
替换 lambda。使用 lambda 和decltype(prior)
需要编译器构造一个新的 lambda 实例,这是不允许的。 MSVC 给出以下使用 lambda 的错误:“错误 C3497:您无法构造 lambda 的实例”
如果您想了解更多信息,可以查看
C3497
。