priority_queue中第一个模板参数的用途是什么

时间:2015-12-07 07:55:22

标签: c++

对于std :: priority_queue,我假设第一个模板参数指定了类型,第二个模板参数应该是该类型的容器。例如:

priority_queue<int, vector<int>> someQueue;

但是,以下代码编译并且似乎运行良好:

class SomeClass
{
};

int main()
{
    priority_queue <SomeClass, vector<int>> pq;
    int x = 9;
    pq.push(x);
    int t = pq.top();
    cout << t << endl;
    pq.pop();
    return 0;
}

以上代码是否无效(即给予UB)?

如果有效 - 在priority_queue中使用的第一个模板参数(即someClass)是什么。

2 个答案:

答案 0 :(得分:5)

在C ++ 11规范中,关于std::priority_queue的部分是§23.6.4。在其中,第一个模板参数只是用于容器的默认类型,而不是其他任何内容。

实际值类型取自容器。

该类声明为

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

[取自this reference]

该声明显示了使用第一个模板参数的方式,时间和位置。

答案 1 :(得分:5)

通过LWG issue 2566

重新投入杰克逊维尔的工作文件
  

容器适配器的第一个模板参数T应表示   与Container::value_type相同的类型。

相应地写std::priority_queue<SomeClass, std::vector<int>>会导致未定义的行为。