C++优先级队列不遵循FIFO顺序

And*_*sti 2 c++ priority-queue fifo

我正在使用STL priority_queue来收集我自己的类Lettura的对象.

//---------LETTURA----------

enum Priority {zero, standard, urgent};

class Lettura{
public:
int valore;
char sensore;
Priority priorita;

Lettura():  valore(0),sensore('\0'),priorita(zero){}
Lettura(const int val, const char s='\0', const Priority p=zero):  valore(val),sensore(s), priorita(p){}

friend ostream& operator<<(ostream& out, const Lettura & lett);
};
Run Code Online (Sandbox Code Playgroud)

我希望它们按照渐进式"priorita"的顺序弹出,但我也希望在普通队列中使用FIFO策略弹出相同优先级的元素.我以随机顺序获得相同优先级的元素:

top: l5  urgent
top: l1  standard
top: l4  standard
top: l6  standard
top: l2  standard
top: l3  standard
Run Code Online (Sandbox Code Playgroud)

我希望FIFO顺序中具有相同优先级的元素:

top: l5  urgent
top: l1  standard
top: l2  standard
top: l3  standard
top: l4  standard
top: l6  standard
Run Code Online (Sandbox Code Playgroud)

这是我的代码:

int main() {
std::priority_queue<Lettura, std::vector<Lettura>, std::less<Lettura> > coda;

Lettura l1(50,'a',standard);
Lettura l2(50,'b',standard);
Lettura l3(120,'c',standard);
Lettura l4(100,'d',standard);
Lettura l5(30,'e',urgent);
Lettura l6(35,'f',standard);

coda.push(l1);
coda.push(l2);
coda.push(l3);
coda.push(l4);
coda.push(l5);
coda.push(l6);


cout<<"top: "<<coda.top()<<"\n";    coda.pop();
cout<<"top: "<<coda.top()<<"\n";    coda.pop();
cout<<"top: "<<coda.top()<<"\n";    coda.pop();
cout<<"top: "<<coda.top()<<"\n";    coda.pop();
cout<<"top: "<<coda.top()<<"\n";    coda.pop();
cout<<"top: "<<coda.top()<<"\n";    coda.pop();
}
Run Code Online (Sandbox Code Playgroud)

我已经实现了这些比较方法:

bool operator<(const Lettura& l1, const Lettura& l2){
return l1.priorita < l2.priorita;
}

bool operator<=(const Lettura& l1, const Lettura& l2){
return l1.priorita <= l2.priorita;
}
Run Code Online (Sandbox Code Playgroud)

我也尝试过不同的队列构造函数,但没有成功:

std::priority_queue<Lettura> coda;
std::priority_queue<Lettura, std::vector<Lettura>, std::less_equal<Lettura> > coda;
Run Code Online (Sandbox Code Playgroud)

有人能帮助我吗?

小智 6

您的代码似乎正常工作,因为您首先获得紧急项目.在基于堆的优先级队列中,插入时间没有子排序,因此您将以未定义的顺序获取具有相同优先级的项目,除了它们将位于具有更高优先级的项目之后.您需要添加一个额外的字段,例如放入队列的时间,并在比较运算符中将其与Priority枚举一起使用.