как перебрать кучу Фибоначчи (буст), которая содержит deque & lt; MyData & gt; элемент

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

#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 (недействительными):
adaptor_type (0)
{}

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

3

Решение

Я думаю, что ошибка в том, что вы не можете создать итератор по умолчанию.
Попробуйте устранить создание 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";
}
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]