C ++ std :: priority_queue使用lambda表达式

时间:2016-12-09 04:40:45

标签: c++ c++11 lambda

有声明编译器无法通过。我无法理解。任何人都可以详细告诉我或如何解决它?祝你好运。

声明如下:

    std::priority_queue<int,std::vector<int>,[](const int& lhs,const int& rhs)
    { 
        return lhs<rhs;
    } > pq;

编译器给出如下信息:

 type/value mismatch at argument 3 in template parameter list for 
'template<class _Tp, class _Sequence, class _Compare> class std::priority_queue'

在cppreference网站中引入了std :: priority_queue:http://en.cppreference.com/w/cpp/container/priority_queue

主要结构如下:

template<
    class T,
    class Container = std::vector<T>,
    class Compare = std::less<typename Container::value_type>
> class priority_queue;

4 个答案:

答案 0 :(得分:2)

您显示的声明具有,即lambda,作为实际模板参数,其中正式模板参数(参数)是一种类型。

以下是使用类型作为模板参数的示例:

#include <vector>
#include <queue>

auto main()
    -> int
{
    struct My_less
    {
        auto operator()( int const a, int const b ) const
            -> bool
        { return a < b; }
    };

    std::priority_queue< int, std::vector<int>, My_less > pq;
}

使用lambda表达式作为比较器的示例:

#include <vector>
#include <queue>

auto main()
    -> int
{
    std::priority_queue< int, std::vector<int>, auto(*)(int,int)->bool > pq{
        []( int a, int b )->bool { return a < b; }
        };
}

C ++11§5.1.12/ 19说“与lambda表达式相关联的闭包类型有一个删除的(8.4.3)默认构造函数并且已删除 复制分配操作员。“这意味着lambda表达式的类型不能用于从头开始实例化lambda。并且lambda不会隐式转换为期望的std::less<T>,这意味着你不能直接将它用作构造函数参数(并且无论如何std::less是无状态的)。但是可以指定lambda转换为的比较器类型,然后使用lambda作为构造函数参数。在上面的代码中,比较器类型是一个简单的原始函数指针。

答案 1 :(得分:1)

如上所述,问题在于模板的第三个参数需要 type ,而不是 value

但是,从C ++ 20起,不可捕获的lambda是默认可构造的。由于每个lambda都有唯一的类型,因此这意味着以下代码将起作用:

std::priority_queue<int, std::vector<int>, decltype([](int lhs, int rhs) {
  return lhs < rhs;
})> pq;
// use pq like normal

如果需要经常使用此特定比较,则可以输入defdef:

using my_pqueue = std::priority_queue<int, std::vector<int>, decltype([](int lhs, int rhs) {
  return lhs < rhs;
})>;

// ...

my_pqueue a;  // don't need to pass in the lambda to the constructor
my_pqueue b;

实时示例:https://godbolt.org/z/cG3P4Y

答案 2 :(得分:0)

    auto comp=[](const int& lhs,const int& rhs)
        { 
            return lhs<rhs;
        };
    std::priority_queue<int,std::vector<int>,decltype(comp) > pq(comp);

    std::priority_queue<int,std::vector<int>,function<bool(const int&,const int&) > pq([](const int& lhs,const int& rhs){ 
            return lhs<rhs;
        });

答案 3 :(得分:-1)

为了达到最佳使用效果,您可以这样做:

priority_queue<State*,vector<State*>,function<bool(const State*,const State*)>> pq([](const State* s1, const State* s2){return s1->hValue>s2->hValue;});