#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()
, вы увидите, что остальные объекты будут переупорядочены.