STL priority_queue参数

STL priority_queue参数

问题描述:

创建STL priority_queue时,第三个参数(决定如何比较队列中的元素以决定哪个参数最大的参数)必须是定义函数运算符的类。如果可以提供lambda表达式会更方便。为什么不允许?如果lambda表达式不捕获任何变量,则应将其视为编译时间常量,对吗?STL priority_queue参数

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;}); 
+0

好吧,与所有表达式一样,lambda表达式也有类型。这只是一个无法形容的。 – 2015-04-01 07:15:47

+0

@ T.C。重新说明(并添加示例)。 – juanchopanza 2015-04-01 07:20:02

+0

答案很有帮助。然而,它并没有回答我的问题:在定义priority_queue模板类时是否存在一个基本问题,以便可以将比较函数作为函数而不是类接受。我猜想,模板参数必须是一个函数类型,参数的类型=存储在priority_queue中的对象的类型。这可能是不被允许的 - 至少它在我试图编译的例子中不起作用。无论如何,谢谢。 – Ekalavya 2015-04-01 10:15:39

priority_queue第三模板参数是一个类型。 Lambda表达式是,表达式,而不是类型。表达式有一个类型。每个lambda表达式都有一个明确的“不可说”的类型。几乎可以参考它的唯一方法是通过autodecltype

auto cmp = [](int a, int b){return a < b;}; 
std::priority_queue<int, std::vector<int>, decltype(cmp)> q1(cmp); 

,如果你只是用q1本地哪个确定。如果你需要传递它,对你的函数的用户来说拼写priority_queue的类型可能会相当困难,你可能需要采用@ juanchopanza的答案中所示的一种方式。