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

438*_*427 11 c++

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

priority_queue<int, vector<int>> someQueue;
Run Code Online (Sandbox Code Playgroud)

但是,以下代码编译并似乎运行正常:

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;
}
Run Code Online (Sandbox Code Playgroud)

上面的代码是无效的(即给出UB)?

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

Som*_*ude 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;
Run Code Online (Sandbox Code Playgroud)

[取自此参考 ]

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

  • 对我来说,这违反了最不惊讶的原则. (6认同)
  • 所以第一个参数仅在我自己没有指定容器时使用 - 是吗? (2认同)

T.C*_*.C. 5

通过LWG第2566号新鲜投票进入杰克逊维尔的工作文件:

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

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