$include_dir="/home/hyper-archives/boost/include"; include("$include_dir/msg-header.inc") ?>
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.