c++ - STL priority_queue 参数

标签 c++ stl priority-queue

当创建 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/

相关文章:

c++ - 摆脱我的 Release 应用程序中的 msvcr120.dll/msvcp120.dll 依赖项 (VC++ 2013)

c++ - 如何在 C++ 中正确地将 char 数组转换为字符串

c++ - std::unordered_map::insert 的更简单形式?

c++ - 将 std 绑定(bind)传递到函数映射的问题

javascript - 基于属性的动态限制队列的数据结构/算法

c++ - 在 pair<int, int> inside priority_queue 的情况下确定优先级?

c++ - 突出显示 QTableWidget 的整行

c++ - 为什么 std::string_view::data 不包含空终止符?

java - 简单的 Java PriorityQueue<String> 错误

c++ - 如何通过 Boost::Python 获取调用我的 C++ 函数的 Python 模块和行号?