Я пытаюсь объявить a priority_queue of nodes
, используя bool Compare(Node a, Node b)
функцию компаратора (которая находится за пределами класса узла).
В настоящее время у меня есть:
priority_queue<Node, vector<Node>, Compare> openSet;
По какой-то причине я получаю Error: "Compare" is not a type name
Изменение декларации на priority_queue <Node, vector<Node>, bool Compare>
дает мне Error: expected a '>'
Я также пробовал:
priority_queue<Node, vector<Node>, Compare()> openSet;
priority_queue<Node, vector<Node>, bool Compare()> openSet;
priority_queue<Node, vector<Node>, Compare<Node, Node>> openSet;
Как правильно декларировать свой priority_queue
?
c++
std
priority-queue
Стивен Морад
источник
источник
operator()
, выглядит проще.pritority_queue
. Возможна перегрузкаoperator<
и использование встроенногоstd::less
компаратора, однако,bool Compare(Node a, Node b)
заявленного вне классаNode
, согласно вопросу.Принятый ответ заставляет вас поверить, что вы должны использовать класс или a в
std::function
качестве компаратора. Это неправда! Как показывает ответ cute_ptr , вы можете передать конструктору указатель на функцию. Однако синтаксис для этого намного проще, чем показано здесь:class Node; bool Compare(Node a, Node b); std::priority_queue<Node, std::vector<Node>, decltype(&Compare)> openSet(Compare);
То есть нет необходимости явно кодировать тип функции, вы можете позволить компилятору сделать это за вас
decltype
.Это очень полезно, если компаратором является лямбда. Вы не можете указать тип лямбда иначе, чем с помощью
decltype
. Например:auto compare = [](Node a, Node b) { return a.foo < b.foo; } std::priority_queue<Node, std::vector<Node>, decltype(compare)> openSet(compare);
источник
Compare
это лямбда, для которой невозможно написать объявление), я не знаю ни одной ловушки.f
заранее в переменной, а затем заменили быCompare
наf
?Compare
может быть лямбда-функция, напримерauto Compare = [](){};
. Но нужно использоватьdecltype(Compare)
, а неdecltype(&Compare)
.Третий параметр шаблона должен быть
operator()(Node,Node)
перегруженным классом . Итак, вам нужно будет создать класс следующим образом:class ComparisonClass { bool operator() (Node, Node) { //comparison code here } };
Затем вы будете использовать этот класс в качестве третьего параметра шаблона, например:
priority_queue<Node, vector<Node>, ComparisonClass> q;
источник
Отвечая на ваш вопрос напрямую:
Компилятор сообщает вам, что именно не так:
Compare
это не имя типа, а экземпляр функции, которая принимает дваNodes
и возвращаетbool
.Вам нужно указать тип указателя функции:
std::priority_queue<Node, std::vector<Node>, bool (*)(Node, Node)> openSet(Compare)
источник
Также можно использовать лямбда-функцию.
auto Compare = [](Node &a, Node &b) { //compare }; std::priority_queue<Node, std::vector<Node>, decltype(Compare)> openset(Compare);
источник
Сначала вы должны определить сравнение. Для этого есть 3 способа:
Класс / структуру легко использовать, потому что легко объявить, просто напишите эту строку кода над исполняемым кодом
struct compare{ public: bool operator()(Node& a,Node& b) // overloading both operators { return a.w < b.w: // if you want increasing order;(i.e increasing for minPQ) return a.w > b.w // if you want reverse of default order;(i.e decreasing for minPQ) } };
Телефонный код:
priority_queue<Node,vector<Node>,compare> pq;
источник
Если это кому-то поможет:
static bool myFunction(Node& p1, Node& p2) {} priority_queue <Node, vector<Node>, function<bool(Node&, Node&)>> pq1(myFunction);
источник
предпочитают структуру, и это то, что делает std :: больше
struct Compare { bool operator()(Node const&, Node &) {} }
источник