Subject: Re: [boost] [heap] A few questions
From: Phil Endecott (spam_from_boost_dev_at_[hidden])
Date: 2011-06-10 16:02:25


Andrew Hundt wrote:
> 1) Is it possible to iterate through the heap in order of priority with an
> iterator?

No - but the question raises an interesting issue.

If you want to iterate in-order through an entire heap efficiently, you
should sort the underlying sequence using std::sort_heap and then
iterate through the result. Clearly that's incompatible with providing
a simple iterator interface.

You might want those iterators so that you can iterate through just a
small part of the heap. For example, I have some code that uses
std::partial_sort to sort just enough of a large std::vector to satisfy
current requirements; this is used to display a scrollable list of
search results, where the common case is that the user only looks at
the first screenful (PSEUDO_CODE):

template <typename T>
class vector_sorted_on_demand {
   std::vector<T> impl;
   size_t n_sorted;
public:
   void push_back(const T& val) {
     impl.push_back(val);
     n_sorted = 0; // This suits the case where everything is added
before anything is read.
   }
   T operator[](size_t idx) {
     if (idx >= n_sorted) {
       size_t n_to_sort = n_sorted/2 + 10; // or whatever
       size_t mid = std::max( idx, std::min(n_sorted + n_to_sort,
impl.size()) );
       std::partial_sort(impl.begin()+n_sorted, impl.begin()+mid, impl.end());
       n_sorted = mid;
     }
     return impl[idx];
   }
};

I could imagine instead maintaining the unsorted portion as a heap,
with some complexity trade-offs.

It seems to me that this sort of thing is best done using an explicit
"underlying container" i.e. std::vector, with algorithms on top of it.
A heap container with iterators just doesn't seem such a good fit: it
maintains the heap predicate safely, but I don't always want that.

This makes me wonder whether Tim's proposed alternative heap structures
should perhaps be decomposed slightly, to expose algorithms in the
style of std::push|pop_heap. Without that, I can't use e.g. the b_heap
in this style of "part heap, part sorted" hybrid container. Is
extracting algorithms practical?

Regards, Phil.