Heap: container or range?

Christopher Wright dhasenan at gmail.com
Thu Jan 29 20:30:33 PST 2009


Andrei Alexandrescu wrote:
> Bill Baxter wrote:
>> On Fri, Jan 30, 2009 at 12:14 PM, Andrei Alexandrescu
>>> Ah, never mind all that. I realized that I can't have a heap range. 
>>> This is
>>> because heaps must mutate the underlying range in-place and any copy 
>>> will
>>> mess the heap up. Here's the example that clarify it for me:
>>>
>>>        int[] a = [ 4, 1, 3, 2, 16, 9, 10, 14, 8, 7 ];
>>>        auto h = Heap!(int[])(a);
>>>        assert(equal(take(5, h) == [ 8, 9, 10, 14, 16 ]);
>>>
>>> At this point the mutations done by take messed up h already!!
>>
>> Messed 'h' up or messed 'a' up?
> 
> 'a' is messed up (mutated) by definition. The problem is that after h 
> was copied to do take's deed, it got messed up (i.e., doesn't respect 
> the heap property anymore).

I'm not seeing that. take should iterate through _h_, which will pop 
elements from _a_ (or a copy thereof) while maintaining the heap invariant.



More information about the Digitalmars-d mailing list