priority_queue的顺序不正确

时间:2019-01-20 00:31:04

标签: c++ priority-queue

我有以下定义:

struct vertex {
int number;
bool mixed = false;

vertex(int n):number(n){};

bool operator > (const vertex & v)const{
    return d[this->number] > d[v.number];
}

使用

priority_queue<vertex, vector<vertex>, greater<vertex> >q

调试之后,我发现队列未按预期排序(遵循数组 d 的顺序)。我想知道为什么。在处理期间, d 的服务器时间被修改。

2 个答案:

答案 0 :(得分:1)

由于d的订购过程中使用了priority_queue,因此一旦开始向队列中添加内容,就无法对其进行更改。这样做可能会更改队列中包含的对象的顺序,并且会破坏用于priority_queue的比较所需的严格弱排序

此外,priorty_queue中的元素没有完全排序,因为它是使用heap实现的。

答案 1 :(得分:1)

如前所述,如果x已经存储在priority_queue中,并且您修改了d[x],则将破坏数据结构。 一个明显的解决方案是删除元素,更改d,然后放回原处。 AFAIK,priority_queue不允许删除随机访问,因此您可以使用setset.begin()返回最低元素。

void update(int x, int v) {
  set.erase(x);
  d[x] = v;
  set.insert(x);
}

int getMin() {
  return *set.begin();
}