在创建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的设计者选择不允许?
发布于 2015-04-01 07:12:38
std::priority_queue的第三个参数是一个类型。lambda表达式不是一种类型,而是一种表达式(您可以将它看作某物的实例或对象)。最重要的是,lambdas没有可以先验知道的类型,但是无状态lambda确实会转换为指针到函数。
为了用lambdas实例化priority_queues,可以使用一些工作:
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;});发布于 2015-04-01 07:24:47
priority_queue的第三个模板参数是类型。Lambda表达式是表达式,而不是类型。表达式有一个类型。每个lambda表达式都有一个不同的“无法说”的类型。您可以参考的唯一方法是通过auto和decltype。
auto cmp = [](int a, int b){return a < b;};
std::priority_queue<int, std::vector<int>, decltype(cmp)> q1(cmp);如果您只是在本地使用q1,这是可以的。如果您需要传递它,您的函数的用户可能很难拼写priority_queue的类型,您可能需要使用@juanchopanza的答案中所示的一种方式。
https://stackoverflow.com/questions/29384550
复制相似问题