首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >STL priority_queue参数

STL priority_queue参数
EN

Stack Overflow用户
提问于 2015-04-01 06:49:24
回答 2查看 3.2K关注 0票数 1

在创建STL priority_queue时,第三个参数(决定如何比较队列中的元素以决定哪一个是最大的)必须是定义函数运算符的类。如果可以提供lambda表达式,则会方便得多。为什么不允许这样做?如果lambda表达式没有捕获任何变量,那么它应该被认为是编译时间常数,对吗?

代码语言:javascript
复制
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的设计者选择不允许?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-04-01 07:12:38

std::priority_queue的第三个参数是一个类型。lambda表达式不是一种类型,而是一种表达式(您可以将它看作某物的实例或对象)。最重要的是,lambdas没有可以先验知道的类型,但是无状态lambda确实会转换为指针到函数。

为了用lambdas实例化priority_queues,可以使用一些工作:

  • 使第三个参数成为函数的指针,并将无状态lambda传递给构造函数。您还可以传递普通函数指针。例如,
  • 将第三个参数设为std::function<bool(int, int)>,并将匹配正确签名的任何类型的lambda传递给构造函数。您可以传递任何可用于构造std::function<bool(int)>的内容。

例如,

代码语言:javascript
复制
// 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;});

代码语言:javascript
复制
// 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;});
票数 2
EN

Stack Overflow用户

发布于 2015-04-01 07:24:47

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

代码语言:javascript
复制
auto cmp = [](int a, int b){return a < b;};
std::priority_queue<int, std::vector<int>, decltype(cmp)> q1(cmp);

如果您只是在本地使用q1,这是可以的。如果您需要传递它,您的函数的用户可能很难拼写priority_queue的类型,您可能需要使用@juanchopanza的答案中所示的一种方式。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29384550

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档