Приоритетная Очередь STL на пользовательском классе

Просто первое, что пришло на ум не могли Вы делать немного самопроводного соединения:

def printErr = System.err.&println
printErr("AHHH")

, но это - немного руководства

14
задан bmalicoat 9 October 2009 в 02:47
поделиться

2 ответа

less :: value_type> Означает, что ваш компаратор сравнивает указатели друг с другом, то есть ваш вектор будут отсортированы по разметке в памяти узлов.

Вы хотите сделать что-то вроде этого:

#include <functional>
struct DereferenceCompareNode : public std::binary_function<Node*, Node*, bool>
{
    bool operator()(const Node* lhs, const Node* rhs) const
    {
        return lhs->getTotalCost() < rhs->getTotalCost();
    }
};

// later...
priority_queue<Node*, vector<Node*>, DereferenceCompareNode> nodesToCheck;

Обратите внимание, что вам нужно указать константно-правильное определение totalCost .

РЕДАКТИРОВАТЬ: Теперь, когда здесь C ++ 11, вам больше не нужно наследовать от std :: binary_function (что означает, что вам не нужно #include function)

22
ответ дан 1 December 2019 в 07:27
поделиться

Вам нужно сделать свой параметр const , потому что на данный момент вы даете ему бесплатную ссылку, что означает, что вы можете изменить объект вы сравниваете с. (Что вы не делаете и, вероятно, не должны).

Вы не правы const. Ваш оператор < не вносит изменений в узел, поэтому функция должна быть const:

bool operator<(const Node &aNode) const;

После этого если у вас возникли проблемы с вызовом функции getTotalCost () , вероятно, она также не является константой. Отметьте его как const, если это еще не сделано:

int getTotalCost(void) const;

Ваш код теперь (больше) const-правильный.

Кстати, бинарные операторы обычно реализуются вне класса:

class Node
{
public:
    // ...

    int getTotalCost(void) const;

    // ...
};

bool operator<(const Node& lhs, const Node& rhs)
{
    return lhs.getTotalCost() < rhs.getTotalCost();
}
14
ответ дан 1 December 2019 в 07:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: