如何获取priority_queue的比较类型?
How to obtain Comparison type of priority_queue?
大多数类似的容器都有 key_compare
或 value_compare
等成员类型,但 none 用于 priority_queue
。
是因为priority_queue
是适配器吗?或者这是错误的标准?
是的,这确实很奇怪,而且似乎是 C++ 标准中的疏忽。该标准将 priority_queue
声明为:
template <class T,
class Container = vector<T>,
class Compare = less<typename Container::value_type> >
class priority_queue;
虽然它指定了以下 public 成员:
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);
}
大多数类似的容器都有 key_compare
或 value_compare
等成员类型,但 none 用于 priority_queue
。
是因为priority_queue
是适配器吗?或者这是错误的标准?
是的,这确实很奇怪,而且似乎是 C++ 标准中的疏忽。该标准将 priority_queue
声明为:
template <class T,
class Container = vector<T>,
class Compare = less<typename Container::value_type> >
class priority_queue;
虽然它指定了以下 public 成员:
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);
}