On Mon, 13 Jun 2011 15:44:01 -0400, nrgyzer <nrgy...@gmail.com> wrote:

On Mon, 13 Jun 2011 14:52:24 -0400, nrgyzer <nrgy...@gmail.com>
wrote:
>> On Mon, 13 Jun 2011 12:15:40 -0400, nrgyzer <nrgy...@gmail.com>
> wrote:
>> > Hi there,
>> >
>> > is there any possibility to get a sliced array from another
array
>> > between two ranges like:
>> >
>> > int[uint] myArray;
>> > myArray[10] = 1000;
>> > myArray[20] = 2000;
>> > myArray[30] = 3000;
>> > myArray[40] = 4000;
>> > myArray[50] = 5000;
>> >
>> > int[] newArray = myArray[>= 20 .. <= 40]; // not able to do
this
>> > writeln(newArray); // should print [2000, 3000, 4000]
>> >
>> > Is there any way to do this?
>> import dcollections.TreeMap;
>> auto myArray = new TreeMap!(uint, int);
>> myArray[10] = 1000;
>> myArray[20] = 2000;
>> myArray[30] = 3000;
>> myArray[40] = 4000;
>> myArray[50] = 5000;
>> // this is a little kludgy, but necessary since you require <= 40
>> auto c = myArray.elemAt(40);
>> c.popFront();
>> int newArray = array(myArray[20..c]);
>> Note two things:
>> 1. int[uint] is a hash, and so has no particular order.
Therefore,
> there
>> is no guarantee of iteration order, or that a range of such a
> container
>> (if one existed) would be properly constructed with two keys.  A
> TreeMap,
>> or RedBlackTree, is sorted, and so the order is guaranteed.
>> 2. dcollections.TreeMap is implemented with the same collection
as
>> std.container.RedBlackTree, so you could potentially do the same
> thing
>> with it.  But the dcollections.TreeMap API is more polished.
>> -Steve
>
> Exactly what I'm looking for, but how can I realize that it also
> gives me the elements when the key doesn't exists like:
>
> import std.range;
> import dcollections.TreeMap;
>
> auto myArray = new TreeMap!(uint, int);
>
> myArray[10] = 1000;
> myArray[20] = 2000;
> myArray[30] = 3000;
> myArray[45] = 4500;
> myArray[50] = 5000;
>
> auto c = myArray.elemAt(40);
> c.popFront();
> int[] newArray = array(myArray[20..c]);
> writeln(newArray);
>
> This will throw an exception because element 40 doesn't exist. Is
> there any possibility to get the element 20 and 30 from this map?
It might be useful to have elemAt return an empty range that is
located at
the place the element *would* be.
When this code was first written, in order to detect whether elemAt
found
your element, you compared it to container.end (similar to C++'s
STL).
But now that cursors are tiny ranges, and have an empty property, I
can
use that to indicate the element wasn't exactly found.  So I can
change
the semantics to find the place the element *would* be.
myArray[20..41];
and it will find all elements >= 20 and < 41, regardless of whether
20 and
41 were valid elements.
Hm... can you post this as an enhancement to dcollections so it's
not
forgotten?
http://www.dsource.org/projects/dcollections/newticket
-Steve

Thanks! I created a new ticket... by the way - is there any bug in
DMD 2.053 by using my own opCmp? The following code throws me an
HiddenFuncException:

private import std.stdio : writeln;

class Example {

        int pId;

        this(int id) {

                pId = id;

        }

        int opCmp(ref Example other) {

The signature of this function must be

int opCmp(Object other)

Note, also, that ref is unnecessary, as all objects (i.e. class instances) are passed by reference.

-Steve

Reply via email to