c++ - priority_queue 上的 reinterpret_cast 是否迭代底层 vector 非标准?

标签 c++ vector priority-queue reinterpret-cast

<分区>

下面的代码编译和运行得很好,但我一直在阅读 reinterpret_cast 并且我无法确定它是否符合标准并且可移植。在我看来,这应该是因为我们明确指定了 priority_queue 的底层容器,但我无法得到直接的答案,所以 SO-wizards 可能对这篇文章有一些了解。

它所做的基本上是创建一个使用 vector 处理整数的 priority_queue。然后它将队列重新解释为 vector 指针,以便可以迭代队列的元素(因为 priority_queue 本身不包含该功能)。

#include <iostream>
#include <vector>
#include <queue>


int main() {
    std::priority_queue< int, std::vector<int> > pq;

    pq.push(100);
    pq.push(32);
    pq.push(1);

    auto o = reinterpret_cast<std::vector<int> *>(&pq);
    for (std::vector<int>::iterator it = (*o).begin(); it != (*o).end(); it++) {
        std::cout << (*it) << std::endl;
    }

    return 0;
}

最佳答案

标准不保证 std::priority_queue布局类(class)。如果这适用于您的实现,那一定是因为 std::vector存储在std::priority_queue的开头对象,但这当然不能依赖。

正确的做法是编写自己的 std::priority_queue 变体(<algorithm> header 已经包含必要的堆算法,例如 std::push_heap )或从 std::priority_queue 派生一个类,这使您可以访问 protected 成员 c指的是底层容器。

关于c++ - priority_queue 上的 reinterpret_cast 是否迭代底层 vector 非标准?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36296398/

相关文章:

c++ - 为什么当 std::initializer_list 被用作赋值参数时它不是引用类型?

java - 如何防止 ActiveMQ 优先级队列上的低优先级消息被饿死?

c++ - 关于STL仿函数的使用,更大的<T>

c++ - 使 C++ 变量成为 const

c++ - 具有 std::map 成员变量的类的下标运算符

c++ - 列表框上下文菜单

c - 什么时候用堆上的单链表实现优先级队列比较好?

c++ - 从类类型到类类型的隐式转换

r - 如何将矩阵的每一行除以R中向量的元素

重复数值向量