【问题标题】:How to obtain Comparison type of priority_queue?如何获取priority_queue的比较类型?
【发布时间】:2016-04-28 09:57:41
【问题描述】:

大多数类似的容器都有key_comparevalue_compare 之类的成员类型,但nonepriority_queue

那是因为priority_queue 是一个适配器吗?或者这是错误的标准?

【问题讨论】:

标签: c++ language-lawyer priority-queue c++-standard-library


【解决方案1】:

是的,这确实很奇怪,似乎是 C++ 标准中的疏忽。该标准将priority_queue 声明为:

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

虽然它指定了以下公共成员:

typedef typename Container::value_type value_type;
typedef typename Container::reference reference;
typedef typename Container::const_reference const_reference;
typedef typename Container::size_type size_type;
typedef Container container_type;

由于某种原因,它省略了 typedef Compare value_compare; 声明。 SO 用户 Columbo 已将 C++ 标准库 issue for this 提交给库工作组 (LWG)。

解决方法

但是,您可以使用以下方法来解决此问题。

在 C++11 及更高版本中

#include <queue>

template <typename> struct GetCompare;

template <typename T, typename Container, typename Compare>
struct GetCompare<std::priority_queue<T, Container, Compare> >
{ using type = Compare; };

template <typename T>
using GetCompare_t = typename GetCompare<T>::type;

例如:

#include <type_traits>

static_assert(
    std::is_same<
        GetCompare_t<std::priority_queue<int> >,
        std::less<int>
    >::value, "");

在 C++03 及更早版本中

#include <queue>

template <typename> struct GetCompare;

template <typename T, typename Container, typename Compare>
struct GetCompare<std::priority_queue<T, Container, Compare> >
{ typedef Compare type; };

例如:

int main() {
    return typename GetCompare<std::priority_queue<int> >::type()(42, 0);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-17
    • 1970-01-01
    • 1970-01-01
    • 2016-05-13
    • 2017-02-10
    • 1970-01-01
    • 1970-01-01
    • 2010-12-29
    相关资源
    最近更新 更多