Associative array key order
H. S. Teoh
hsteoh at quickfur.ath.cx
Fri Aug 23 11:59:35 PDT 2013
On Fri, Aug 23, 2013 at 11:22:47AM -0700, Sean Kelly wrote:
> On Jul 31, 2013, at 7:55 AM, Dicebot <public at dicebot.lv> wrote:
>
> > On Wednesday, 31 July 2013 at 14:43:21 UTC, Daniel Kozak wrote:
> >> is there a way for AA to behave same as PHP?
> >
> > I doubt it. This snippet suggests that AA's in PHP are not simply
> > AA's and do additionally track insertion order (or use some similar
> > trick). Data in associative arrays is organized in a way that allows
> > fast key lookup and iterating in an original order requires tracking
> > extra state. Contrary to PHP, D does care about performance so I see
> > no way this can happen automatically.
>
> This seems more likely to be a library type. I have something like
> this that I use very frequently at work where the behavior is
> pluggable, so it can be used as a cache that automatically does
> LIFO/FIFO eviction according to an age window, number of entries, etc.
> Or none of those if all you want is a plain old hashtable. It's not a
> tremendous amount of work to adapt an existing implementation to work
> this way. The only annoying bit I ran into (at least with C++) is
> that the symbol lookup rules pretty much prevent overrides of existing
> functions to be mixed in via the policies. Does alias this work
> around this problem in D? I've never tried.
In http://d.puremagic.com/issues/show_bug.cgi?id=10733 bearophile and I
discussed code reuse between the current AA and an ordered AA
implementation. It appears that a more fundamental structure is the Set,
where the key is the value. An AA can be implemented in terms of a Set,
by making the set element a struct containing a key and value field,
with a custom toHash() and opCmp() that only hashes/compares the key
part.
By adding a pair of pointers to this customized set element, we can make
an ordered AA in terms of Set.
Plus, a Set is something that's very useful on its own as well.
T
--
Береги платье снову, а здоровье смолоду.
More information about the Digitalmars-d-learn
mailing list