有没有办法在不弹出的情况下按堆顺序遍历堆?

Is there a way to iterate through a heap in its heap order without popping?

如果我创建一个堆并遍历它,它不会以正确的顺序显示它:

vector<int> q;
q.push_back(3);
q.push_back(7);
q.push_back(5);
make_heap(q.begin(), q.end());

for (auto it = q.begin(); it != q.end(); ++it) {
    cout << *it << " ";
}

输出:

7 3 5

当我想要的时候

7 5 3

我知道我每次都可以简单地弹出最大值。但是,如果不想弹出任何东西怎么办?

不,堆没有完全排序。如果您愿意,弹出是对堆进行排序的操作。

最简单的方法是复制整个堆,然后从中弹出元素。我认为如果没有第二个堆你就无法做到这一点,因为在任何给定的时间点,你需要从堆顶部向下移动的可能的下一个元素的“波前”的最小元素 - 以及那个波前需要按最小(或最大)值的顺序选择元素。