Can someone help me make a binary heap with std.container.binaryheap? It's not working... AssertError

Ali Çehreli via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Mon Sep 28 00:20:00 PDT 2015


On 09/25/2015 08:22 PM, Enjoys Math wrote:
> Init:
>
> programResultsQ = heapify!(compareResults,
> Array!(Results!(O,I)))(Array!(Results!(O,I))([Results!(O,I)()]), 1);
>
> Decl:
>
> alias ProgramResultsQueue(O,I) = BinaryHeap!(Array!(Results!(O,I)),
> compareResults);
>
> Error:
>
> assert error in std.container.array.d (line 381)
>
> upon running.  Compiles fine.  I'd like to initialize the heap to empty
> if possible.

import std.container;
import std.algorithm;
import std.traits;

void main()
{
     // The data to start with
     auto data = [ 10, 5, -7, 20, 0, 3 ];

     // This will move elements around to make a binary heap
     auto heap = heapify(data);

     // Yes, it is a BinaryHeap:
     static assert(isInstanceOf!(BinaryHeap, typeof(heap)));

     // Yes, the elements are in binary heap order:
     assert(data == [20, 10, 3, 5, 0, -7]);

     /* As is the case with binary heaps, although the data is
        ordered al a binary heap, that data is the equivalent
        of the following binary search tree:

              20
            /    \
           /      \
         10        3
        /  \      /
       5    0    -7

     */

     // Let's visit the elements through the binary heap
     // range. They should appear in descending order:
     assert(heap.equal([20, 10, 5, 3, 0, -7 ]));
}

 > I'd like to initialize the heap to empty
 > if possible.

The following works (at least for int elements):

import std.container;
import std.algorithm;
import std.traits;

void main()
{
     // Let's start with an empty array:
     Array!int data;

     auto heap = heapify(data);
     assert(heap.empty);

     heap.insert(42);
     heap.insert(-10);
     heap.insert(7);
     assert(heap.equal([ 42, 7, -10 ]));
}

Ali



More information about the Digitalmars-d-learn mailing list