优先级队列对对象排序不正确(用户定义的比较)

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 对象a0a1a2a3 推入优先级队列时,到达时间为20050 和分别是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() 弹出对象时,您会看到剩余的对象被重新排序。

【讨论】:

以上是关于优先级队列对对象排序不正确(用户定义的比较)的主要内容,如果未能解决你的问题,请参考以下文章

具有自定义比较功能的 C++ 优先级队列在 Push() 上行为不正确

用户定义对象的优先队列

JAVA比较器的写法和优先队列的使用

JAVA比较器的写法和优先队列的使用

scala优先级队列没有正确排序?

Java中的Collection和Map--PriorityQueue