On Monday, 13 November 2017 at 16:26:20 UTC, balddenimhero wrote:
In the course of writing a minimal example I removed more than necessary in the previous pastebin (the passed IntOrder has not even been used). Thus here is the corrected one: https://pastebin.com/SKae08GT. I'm trying to port this to D.
Throwing together a sample involves wrapping the value in a new value. Still the idea is put across...
Not sure if this is the best way to do this, but only takes a little dereferencing to access the value.
Compiled w/DMD v2.069.2 [code] import std.container.binaryheap; import std.range : iota; import std.array; import std.stdio; void main() { int len = 10; int[] a = iota(len).array; auto foo = new WeightedHeap!int([0,2,4,6,8], a); foreach(v; foo.h) writeln(v.weight, "\t", *v.v); } struct WeightedHeap(T) { this(int[] order, T[] arr) { foreach(i, ref v; arr) { a ~= E(order[i%$], &v); } h = BinaryHeap!(E[])(a); } E[] a; BinaryHeap!(E[]) h; // alias h this; static struct E { int weight; T* v; // alias v this; int opCmp(E a) const { return a.weight-weight; } } } [/code] Output: Weight Value 0 5 0 0 2 1 2 6 4 7 4 2 6 3 6 8 8 4 8 9