TENET_T 2021-02-09 16:04 采纳率: 100%
浏览 2256
已结题

c++这样创建优先队列中的第三个参数decltype(&cmp)是什么意思?

priority_queue<pair<int, int>, vector<pair<int, int>>, decltype(&cmp)> q(cmp);

cmp是如下自定义的一个函数,是为了按照pair中的第二关键字降序排列

static bool cmp(pair<int, int>& m, pair<int, int>& n) {
    return m.second > n.second;
}

还有为什么q后面还要加上一个(cmp)

我在网上搜索的创建优先队列都是下面这样子,但没说第三个参数是自定义函数的时候该怎么写

//升序队列
priority_queue <int,vector<int>,greater<int> > q;
//降序队列
priority_queue <int,vector<int>,less<int> >q;
  • 写回答

1条回答 默认 最新

  • 幻灰龙 2021-02-12 19:59
    关注

    请看优先级队列的定义:

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

     

    std::priority_queue 是一个模板类,有三个模板类型参数,分别是:

    1. 参数1: 优先级队列的元素类型 T ,例如问题里第一个例子,元素类型 T 是 std::pair<int,int> ,后面两个例子,元素类型 T 是 int
    2. 参数2: 优先级队列内部具体用那种容器(Container) 存储参数1指定的元素类型,例如问题里的 vector< pair<int,int> > 和 vector<int>。实际上,第2个模板参数是有默认类型参数的,默认类型参数是 vector<T> ,T 取决于参数1指定的类型是什么。
    3. 参数3: 参数3需要指定一个实现了 operator< 操作符的类(叫做仿函数或者函数对象,实际上就是类,只是调用时写起来像函数一样),比较操作符的实现符合 严格弱顺序 strict weak order  语义,请参考资料3。模板参数3也是有默认类型,默认是 std::less<typename Container::value_type> ,其中 Container 指的是参数2,Container::value_type 指的是参数2类内部的声明的其元素值的类型。
    4. 最后,decltype 用于类型自动推断,传入&cmp函数指针,decltype自动推断出第3个模版参数类型应该是什么。总的来说,如果你的元素类型已经符合严格弱顺序排序,只要自定优先级队列的第1个模版参数即可。

     

    参考:

    1. std::priority_queue https://en.cppreference.com/w/cpp/container/priority_queue
    2. std::less  https://en.cppreference.com/w/cpp/utility/functional/less
    3. strict weak order https://en.cppreference.com/w/cpp/concepts/strict_weak_order
    4. decltype https://en.cppreference.com/w/cpp/language/decltype
    本回答被专家选为最佳回答 , 对您是否有帮助呢?
    评论
    1人已打赏

报告相同问题?

问题事件

  • 系统已结题 9月16日
  • 专家已采纳回答 9月8日

悬赏问题

  • ¥15 #MATLAB仿真#车辆换道路径规划
  • ¥15 java 操作 elasticsearch 8.1 实现 索引的重建
  • ¥15 数据可视化Python
  • ¥15 要给毕业设计添加扫码登录的功能!!有偿
  • ¥15 kafka 分区副本增加会导致消息丢失或者不可用吗?
  • ¥15 微信公众号自制会员卡没有收款渠道啊
  • ¥15 stable diffusion
  • ¥100 Jenkins自动化部署—悬赏100元
  • ¥15 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条