优先级队列对对象排序不正确(用户定义的比较)
Posted
技术标签:
【中文标题】优先级队列对对象排序不正确(用户定义的比较)【英文标题】:Priority Queue Sorting Objects Incorrectly (User-Defined Compare) 【发布时间】:2020-09-19 12:24:31 【问题描述】:我有一个类Customer
,它有一个成员变量arrivalTime
。我已经定义了一个 getter 函数getArrivalTime()
。我将Customer
存储在优先级队列中,并定义了一个自定义谓词,如下所示:
class ArrivalQueueCompare
public:
bool operator()(const Customer &a, const Customer &b)
return a.getArrivalTime() > b.getArrivalTime();
;
优先级队列声明为:
std::priority_queue<Customer, std::vector<Customer>, ArrivalQueueCompare> arrivalQueue;
当我将四个Customer
对象a0
、a1
、a2
和a3
推入优先级队列时,到达时间为20
、0
、50
和分别是30
,优先级队列似乎已经按照a1
-a0
-a2
-a3
的顺序存储了它们。
根据我的谓词,顺序应该是a1
-a0
-a3
-a2
,但优先级队列会存储它们。为什么会这样?
我附上了 Xcode 调试器屏幕的截图作为证明:Screenshot 1Screenshot 2Screenshot 3Screenshot 4
更新:
我正在从文件中读取行并创建 Customer
对象:
while (std::getline(file, line))
Customer newCustomer = createCustomerObject(line);
arrivalQueue.push(newCustomer);
createCustomerObject()
函数只是通过使用line
初始化Customer
的成员变量来创建并返回一个Customer
对象。
【问题讨论】:
【参考方案1】:priority_queue
不以排序方式存储对象。它只保证第一个元素是最大的(取决于你的比较)。
因此,期望观察存储向量中以无序方式存储的对象。
当您开始使用pop()
弹出对象时,您会看到剩余的对象被重新排序。
【讨论】:
以上是关于优先级队列对对象排序不正确(用户定义的比较)的主要内容,如果未能解决你的问题,请参考以下文章