Map with maintained insertion order

Brad Anderson eco at gnuk.net
Fri Mar 23 23:29:28 PDT 2012


On Saturday, 24 March 2012 at 01:07:56 UTC, Jonathan M Davis 
wrote:
> On Friday, March 23, 2012 23:48:51 Andrej Mitrovic wrote:
>> Does someone have a map implementation that maintains the 
>> insertion
>> order of the keys?
>> 
>> E.g.:
>> 
>> string[string] map;
>> map["foo"] = "x";
>> map["bar"] = "y";
>> 
>> When iterating over map keys I want to visit "foo" first, then 
>> "bar", and
>> so on.
>
> I can't think of any data structure that does that off the top 
> of my head,
> though there may very well be one. If you don't mind the extra 
> memory
> overhead, it wouldn't be all that hard to do it with multiple 
> maps wrapped
> in a single type. You could do something like
>
> class InsertedOrderMap
> {
>     string[string] _map;
>     RedBlackTree!(Tuple!(int, string), "a[0] < b[0]") 
> _insertionOrder;
>
>     ...
> }
>
> _map holds the normal map and _insertionOrder holds pairs of 
> the insertion
> ordered and the key to _map.
>
> You can then have your range iterate over _insertionOrder and 
> use the keys
> to return either the keys, values, or pairs of keys and values 
> from _map,
> depending on what you want to iterate over.
>
> That _does_ require having two data structures in one, and 
> there may a be a
> better way to do it, but just off the top of my head, that's 
> the best that I
> can come up with. I don't know how you could have a data 
> structure where
> it's efficient to index by both insertion order and key without 
> effectively
> having two data structures. But I really should go reread my 
> data structures
> books. It's been too long since I studied that stuff.
>
> - Jonathan M Davis

Ruby's Hash in 1.9 maintains insertion order.  It does it using a 
linked list between the nodes as they are created (so yes, 
essentially two data structures).

Regards,
Brad Anderson


More information about the Digitalmars-d-learn mailing list