Int within ranges

nrgyzer nrgyzer at gmail.com
Mon Jun 13 13:11:16 PDT 2011


== Auszug aus Steven Schveighoffer (schveiguy at yahoo.com)'s Artikel
> On Mon, 13 Jun 2011 15:44:01 -0400, nrgyzer <nrgyzer at gmail.com>
wrote:
> >> On Mon, 13 Jun 2011 14:52:24 -0400, nrgyzer <nrgyzer at gmail.com>
> > wrote:
> >> >> On Mon, 13 Jun 2011 12:15:40 -0400, nrgyzer
<nrgyzer at 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

Works, thanks for all that!


More information about the Digitalmars-d-learn mailing list