digitalmars.D.learn - Remarks on std.container

Hi,
I wanted to have a binary heap where I can update entries and restore
the heap structure.
1. First I observed that due to the implementation of
std.container.BinaryHeap, keeping track of the position of a certain
value in the heap cannot be done directly, but it would be helpful to
pass a "Swapper" object (or function) to the methods that may change the
order of the elements such that this Swapper is called for every swap()
operation such that the user of the BinaryHeap can keep track of the
permutation.
2. I tried to create a heap structure on my own, using
std.container.Array as a store. Of course, it I also needs to perform
swap operations, but the following did not work:
std.algorithm.swap(arrayInstance[i], arrayInstance[j]);
Also there is no usable swap() method of Array. So do I really have to
perform the swap on my own? I mean, 3 lines of code aren't that much but
I really expected an easy way.
3. For my structure I wanted to check the heap structure in an
invariant(). Unfortunately, accessing stored elements of Array is no
const operation, hence I could not implement such an invariant.
Maybe I'm not using it correctly, so any help or comments would be nice.
Best regards,
Matthias

Hi,
I wanted to have a binary heap where I can update entries and restore
the heap structure.

<shameless plug>
I totally built this functionality in to multi_index's red black tree,
hash table, and heap indeces.
-------------------------------------------------
alias MultiIndexContainer!(int, IndexedBy!(Heap!())) C1;
C1 c = new C1;
c.insert([1,2,3,4,5]);
auto rng = c[];
<point rng to item you want>
// modify the value, then heap is restored by container
c.modify(rng, (ref int i){ i = 42; });
-------------------------------------------------
If you have a more complicated type, you can also set up a signals and
slots thing so you can keep a reference to your object and modify it and
the container will automatically fix the heap without you having to use
modify.
I also started on converting ranges from one index to ranges of another
for e.g. using a hash table to reference your value/object, but I'm
waiting on compiler bugs.
</shameless plug>