Am 18.06.19 um 17:45 schrieb lili:
> Hi Guys:
>    see this code
> ~~~
>     int[] ar = [1,2,3,4,52,34,22];
>     auto h = heapify(ar);
>     assert(h.length() == ar.length);
>     writeln("h:",h);
>     assert(h.empty());
> ~~~
> dmd v2.086.0  run all assert passed. Why?

The result of heapify is a BinaryHeap, which is a range. writeln
basically prints ranges by iterating over them and printing each element
(except for the types which are special cased, such as dynamic arrays
etc.). However, ranges are consumed by iterating over them, which
explains the behavior because writeln is not special cased for BinaryHeaps.

In order to avoid this, you can make a copy of the BinaryHeap before
printing it:

import std;

void main()
    int[] ar = [1, 2, 3, 4, 52, 34, 22];
    auto h = heapify(ar);
    assert(h.length() == ar.length);
    writeln("h:", h.dup);

Funnily enough, BinaryHeap does not implement a "save" method, which is
the usual way of making ranges copiable, i.e. making them ForwardRanges.
In this case I believe save could even simply be an alias to dup.

Reply via email to