как перебирать кучу Фибоначчи (повышение), содержащую элемент deque‹MyData›

Я использую кучу Фибоначчи (увеличение) для упорядочения массива элементов, но я не могу перебирать кучу. Код такой:

#include <deque>
#include <boost/heap/fibonacci_heap.hpp>
#include <iostream>

struct MyData {
     ...
     long int id;

     ...
}; 

struct MyCompare{
    bool operator()(const deque<MyData> &a, const deque<MyData> &b) const
    {
        return a[a.size()-1].id > b[b.size()-1].id;
    }
};


int main()
{   deque<MyData> array1;
    deque<MyData> array2;

    MyData app;
    app.id=15;
    array1.push_front(app);
    app.id=10;
    array1.push_front(app);

    app.id=5;
    array2.push_front(app);
    app.id=2;
    array2.push_front(app);

    boost::heap::fibonacci_heap<deque<MyData>, boost::heap::compare<MyCompare> > fib_heap;  
    fib_heap.push(array1);
    fib_heap.push(array2);
    boost::heap::fibonacci_heap<deque<MyData>, boost::heap::compare<MyCompare> >::iterator it;
    boost::heap::fibonacci_heap<deque<MyData>, boost::heap::compare<MyCompare> >::iterator beg =fib_heap.begin();
    boost::heap::fibonacci_heap<deque<MyData>, boost::heap::compare<MyCompare> >::iterator end =fib_heap.end();

    for (it=beg;it!=end; ++it) {
        deque<MyData> elem;
        elem =*it;
        for (int k=0;k < elem.size();k++)
            cout<<" "<<elem[k].id;
        cout<<"\n";         
    }


}

Это дает мне эту ошибку в строке "elem = *it": Ошибка в экземпляре recursive_tree_iterator: recursive_tree_iterator(void): adapter_type(0) {}

Есть ли способ сделать это? Или использовать другую упорядоченную кучу вместо Фибоначчи? Большое спасибо.


person user3190747    schedule 14.01.2014    source источник


Ответы (1)


Я думаю, что ошибка в том, что вы не можете создать итератор по умолчанию. Попробуйте отказаться от создания переменной it и переместить ее внутрь цикла for:

boost::heap::fibonacci_heap<deque<MyData>, boost::heap::compare<MyCompare> >::iterator beg =fib_heap.begin();
boost::heap::fibonacci_heap<deque<MyData>, boost::heap::compare<MyCompare> >::iterator end =fib_heap.end();

for (boost::heap::fibonacci_heap<deque<MyData>, boost::heap::compare<MyCompare> >::iterator it=beg;it!=end; ++it) {
    deque<MyData> elem;
    elem =*it;
    for (size_t k=0;k < elem.size();k++)
        cout<<" "<<elem[k].id;
    cout<<"\n";         
}

Чтобы выполнить итерацию в порядке кучи, вы можете использовать:

ordered_iterator ordered_begin(void) const;
ordered_iterator ordered_end(void) const;

Кроме того, я думаю, что код выиграет от использования ключевого слова auto:

for (auto it=fib_heap.begin(), end=fib_heap.end();it!=end; ++it) {
    deque<MyData> elem;
    elem =*it;
    for (size_t k=0;k < elem.size();k++)
        cout<<" "<<elem[k].id;
    cout<<"\n";         
}
person J. Calleja    schedule 23.07.2017