> 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) { return pId - other.pId; } } int main(string[] args) { Example[] exps; exps ~= new Example(1); exps ~= new Example(2); writeln(exps.sort); return 1; }