boost :: fibonacci_heap: вложенное определение дескриптора с переопределенными компаратором ошибками циклического определения - PullRequest
0 голосов
/ 26 июня 2019

Документация Boost и предыдущее переполнение стека дают рабочие примеры того, как определять пользовательские функции компаратора, и включают дескриптор в тип узла в динамической куче. Однако, когда я объединяю обе эти функции (пользовательскую функцию сравнения и дескриптор в типе узла), я получаю сообщения об ошибках, указывающие на недопустимое использование неполного типа «struct compare_Node».

https://www.boost.org/doc/libs/1_63_0/doc/html/heap/concepts.html#heap.concepts.mutability

Использование boost fibonacci_heap

Определение функции сравнения для кучи Фибоначчи в форсировании

Уменьшить работу в куче Фибоначчи, повысить

Кроме предопределения обеих структур Node и compare_Node, я не уверен, что решу проблему округлости, при этом сохраняя дескриптор безопасно как элемент в структуре Node.

#include <boost/heap/fibonacci_heap.hpp>

struct compare_Node; //predefine to avoid circular issues
struct Node; //predefine to avoid circular issues

using fib_heap = boost::heap::fibonacci_heap<struct Node*,
    boost::heap::compare<struct compare_Node>>;

// 6-byte struct total
struct Node {
    double value; 

    fib_heap::handle_type* handle; // orig
};

// override for min_heap
struct compare_Node
{
    bool operator() (struct Node* const n1, struct Node* const n2) const
    {
        return n1->value > n2->value;
    }
};

int main() {
    fib_heap heap;
    return 0;
}

1 Ответ

0 голосов
/ 26 июня 2019

Определить compare_Node только с объявлением operator().Указатели на Node не нуждаются в Node определении.После определения Node вы можете добавить тело operator():

struct compare_Node
{
    bool operator() (struct Node* const n1, struct Node* const n2) const;
};

using fib_heap = boost::heap::fibonacci_heap<struct Node*,
    boost::heap::compare<struct compare_Node>>;

// 6-byte struct total
struct Node {
    double value; 

    fib_heap::handle_type* handle; // orig
};

bool compare_Node::operator() (struct Node* const n1, struct Node* const n2) const
{
        return n1->value > n2->value;
}

Демо-версия .

...