Неправильная сортировка объектов приоритетной очереди (пользовательское сравнение)

#c #priority-queue

#c #приоритет-очередь

Вопрос:

У меня есть класс Customer , в котором есть переменная-член arrivalTime . Я определил функцию получения getArrivalTime() . Я сохраняю Customer в очереди приоритетов и определил пользовательский предикат следующим образом:

 class ArrivalQueueCompare
{
public:
    bool operator()(const Customer amp;a, const Customer amp;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: Скриншот 1 Скриншот 2 Скриншот 3 Скриншот 4

Обновить:

Я читаю строки из файла и создаю Customer объекты с:

  while (std::getline(file, line))
    {
        Customer newCustomer = createCustomerObject(line);

        arrivalQueue.push(newCustomer);
    }
  

createCustomerObject() Функция просто создает и возвращает Customer объект путем инициализации переменных-членов Customer using line .

Ответ №1:

A priority_queue не сохраняет объект отсортированным образом. Это гарантирует только то, что первый элемент является самым большим (в зависимости от вашего сравнения).

Таким образом, ожидается наблюдение за объектами, хранящимися неупорядоченным образом в векторе хранения.

Когда вы начнете вставлять объекты pop() , вы увидите, что остальные объекты будут переупорядочены.