Creating a growable binary heap or priority queue using Phobos?

SimonM user at example.net
Sun Nov 13 13:12:30 PST 2011


On 2011/11/13 22:49 PM, SimonM wrote:
> Hey, I'm trying to use the BinaryHeap in Phobos, but somehow can't get
> it working with the Array!(T) container so that the heap can actually be
> growable. I keep getting this error:
>
> Error: template instance BinaryHeap!(myArray,"a > b") does not match
> template declaration BinaryHeap(Store,alias less = "a < b") if
> (isRandomAccessRange!(Store) || isRandomAccessRange!(typeof(Store.init[])))
>
> The documentation
> (http://d-programming-language.org/phobos/std_container.html#BinaryHeap)
> says that BinaryHeap should be growable with any container that supports
> the insertBack function, which Array!(T) does
> (http://d-programming-language.org/phobos/std_container.html#insertBack).
>
> I've found the following questions in the newsgroup that all asked the
> same question, without really resolving it (without using their own
> implementation):
>
> 2011, 28 March:
> http://www.digitalmars.com/d/archives/digitalmars/D/learn/Growable_BinaryHeap_use_w_Array_25362.html
>
>
> 2011, 6 March:
> http://www.digitalmars.com/d/archives/digitalmars/D/learn/How_do_you_use_BinaryHeap_with_Array_or_just_make_a_growable_heap_25928.html
>
>
> 2009, 27 April:
> http://www.digitalmars.com/d/archives/digitalmars/D/std.algorithm.BinaryHeap_88811.html
>
>
>  From those threads, I found that the reason might be related to the
> fact that the isRandomAccessRange template returns false when used with
> an Array!(T) object, for example this
> ----------------------------------------
> import std.range;
> import std.container;
>
> void main(){
> pragma(msg,isRandomAccessRange!(Array!(uint)));
> }
> ----------------------------------------
> prints out false during compilation.
>
> Is there any way to use Array!(T) with a BinaryHeap, or any other way to
> have a growable BinaryHeap?

Okay, I might on the wrong track, but part of the reason that the 
isRandomAccessRange template fails might be because, while Array!(T) 
internally uses a Range, it doesn't itself actually provide the save() 
and popBack() functions that a Range does?


More information about the Digitalmars-d-learn mailing list