On Thursday, February 07, 2013 21:20:46 Dan wrote: > For an associative array, what is the best idiom that allows for > checking if a key exists in the AA. If it does do something with > the value, if not initialize the value and then do something with > it. > > In this code: http://dpaste.dzfl.pl/daab318f > > How would this piece be improved? It looks like it would have to > perform the hash and do a find 3 times: > > auto exists = (k in _dataMap); > if(!exists) { > _dataMap[k] = init; > exists = (k in _dataMap); > } > ... use *exists > > At a higher level and assuming the general goal of this basic > struct is clear, any other suggestions welcome. > > Also, an FYI to dpaste maintainer that the compiler service has > been unavailable for a while.
Remove the useless parens around the in expression. :) Seriously though, I believe that you're pretty much doing it exactly as its supposed to be done, except that you can avoid some of the extra overhead if don't need to refer to the actual element in the AA. If that's the case, you can do T var; if(auto found = k in _dataMap) var = *found; else { var = init; _dataMap[k] = var; } //...use var Of course, if assigning T is expensive enough, that could actually be more expensive than your example, since an extra assignment is required. Or, if you didn't care about actually putting it in the AA, you could use the get function. auto var = _dataMap.get(k, init); But I certainly agree that it would be nice if there were a function that inserted the element if it wasn't already there and then returns it regardless of whether it was there or not. I don't think that such a function exists though. - Jonathan M Davis