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

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 11: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月15日
  • 专家已采纳回答 9月8日

悬赏问题

  • ¥15 获取到海康hls的视频地址是http协议导致无法正常播放
  • ¥15 seL4如何实现从终端输入数据
  • ¥15 方波信号时频特征分析/信号调制与解调过程分析/利用DFT分析信号频谱
  • ¥20 两台硬件相同的琴设备一个是高阶版,怎么扒到初阶版
  • ¥30 matlab求解周期与坐标
  • ¥15 MATLAB图片转灰度格式问题
  • ¥15 把h5作品链接复制到自己的账号里
  • ¥15 ensp抓包实验配置
  • ¥15 强化学习算法、MRO
  • ¥15 想要学习一门技术来保证以后能够吃上碗饭,该学什么好
手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部