当创建 STL priority_queue 时,第三个参数(决定如何比较队列中的元素以确定哪个最大的参数)必须是定义了函数运算符的类。如果可以提供 lambda 表达式会方便得多。为什么不允许这样做?如果 lambda 表达式不捕获任何变量,则应将其视为编译时常量,对吧?
struct compare{
bool operator()(int p, int q){return p > q;}
};
priority_queue< int, vector<int>, compare> intpq;
priority_queue< int, vector<int>,
[](int p, int q){return p > q;}
> intpq2;
第二个定义,即 intpq2,给出了一个错误:模板参数 3 无效。接受第二种定义是否存在根本问题,还是priority_queue的设计者选择不允许?
最佳答案
std::priority_queue
的第三个参数是一种类型。 lambda 表达式不是类型,而是表达式(您可以将其视为某个实例或对象)。最重要的是,lambda 没有可以先验已知的类型,但无状态 lambda 会转换为指向函数的指针。
为了使用 lambda 实例化 priority_queues,您可以使用一些解决方法:
将第三个参数设为指向函数的指针,并将无状态 lambda 传递给构造函数。您还可以传递普通函数指针。例如,
将第三个参数设置为
std::function<bool(int, int)>
并将与正确签名匹配的任何类型的 lambda 传递给构造函数。您可以传递可用于构造std::function<bool(int)>
的任何内容.
例如,
// no capture. Pointer to function is OK
std::priority_queue<int, std::vector<int>, bool (*)(int, int)>
q2([](int a, int b){return a < b;});
或
// capture. Can't use pointer to function.
std::priority_queue<int, std::vector<int>, std::function<bool(int, int)>>
q2([some_var](int a, int b){return a < b;});
关于c++ - STL priority_queue 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29384550/