C++, приоритетная очередь, элементы не сортируются

У меня проблема с очередью приоритетов:

std::priority_queue <NodePrio, std::vector<NodePrio>, sortNodesByPrio> PQ;

куда

struct NodePrio
{
Node *node;
double priority;

NodePrio() : node(NULL), priority(0) {}
NodePrio(Node *node_, double priority_) : node(node_), priority(priority_) {}
};

а также

class sortNodesByPrio
{
public:
    bool operator () (const NodePrio &n1, const NodePrio  &n2)   const;
}


bool sortNodesByPrio::operator () (const NodePrio &n1, const NodePrio &n2) const
{
return n1.priority < n2.priority;
}

После многократного нажатия новых элементов

PQ.push(NodePrio(node, distance));

и ни с какого момента времени они не сортируются (см.ниже)... Пробовал отлаживать код, код компаратора неоднократно выполнялся...

Step1: 
push (node, 55.33);

PQ:
[0] 55.33

Step2:
push (node, 105.91);

PQ:
[0] 105.91
[1] 55.33

Step 3:
push (node, 45.18);

PQ:
[0] 105.91
[1] 55.33
[2] 45.18

Step 4:
push (node, 70.44);

PQ:
[0] 105.91
[1] 70.44
[2] 45.18
[3] 55.33   //Bad sort

person Ian    schedule 26.11.2010    source источник
comment
Что вы имеете в виду под тем, что они не отсортированы? Можете ли вы опубликовать некоторые примеры данных, которые вы вводите, и результат, когда вы выталкиваете все данные из очереди приоритетов?   -  person James McNellis    schedule 26.11.2010
comment
Можете ли вы привести пример или два вашего ввода и каково итоговое содержимое очереди? Кроме того, что вы уже пробовали для отладки?   -  person suszterpatt    schedule 26.11.2010


Ответы (2)


Судя по показанным вами «примерным результатам», похоже, вы не понимаете, что такое приоритетная очередь.

Очередь с приоритетом гарантирует, что при удалении из нее элементов (используя top() и pop()) элементы будут удалены в порядке приоритета. Элементы не хранятся в порядке приоритета, они хранятся в куче.

Вы можете обратиться к своей любимой книге по алгоритмам или на веб-сайт для получения дополнительной информации о том, как приоритетная очередь хранит свои элементы.

person James McNellis    schedule 26.11.2010
comment
Спасибо за объяснение, теперь понятно. Я думал, что все элементы отсортированы как на карте, но разрешено дублирование ключей. - person Ian; 26.11.2010
comment
Вам понадобится std::multimap для этого. - person suszterpatt; 26.11.2010
comment
@suszterpatt. вообще не думаю. Я знал, как работает PQ, но совершенно ошибался насчет внутреннего хранения предметов. - person Ian; 26.11.2010
comment
@Ian: элементы не сортируются, как в std::map. В обычных реализациях std::map элементы сортируются в двоичном дереве поиска, так что элементы могут быть извлечены в отсортированном порядке путем выполнения обхода дерева по порядку. Это не относится к куче. - person James McNellis; 26.11.2010

Попробуйте изменить

return n1.priority() < n2.priority();

to

return n1.priority < n2.priority;
person Community    schedule 26.11.2010
comment
глупый вопрос: что делает добавление () к переменной? - person Markus Kull; 26.11.2010
comment
@Markus: Это сделало бы это вызовом функции; это было бы допустимо, если бы priority относился к какому-то типу, который можно было бы вызывать как функцию без аргументов, но, поскольку это double, добавление к нему () делает код неправильным. Я предполагаю, что ОП не скопировал и не вставил свой точный код; есть еще одна синтаксическая ошибка. - person James McNellis; 26.11.2010
comment
@Rohit: извините, это была моя ошибка при публикации кода ... Исходный исходный код верен. - person Ian; 26.11.2010