Using "in" with associative arrays and then indexing them (efficiency)

Timon Gehr timon.gehr at
Tue Jan 3 03:13:45 PST 2012

On 01/03/2012 12:07 PM, Jonathan M Davis wrote:
> On Tuesday, January 03, 2012 11:52:13 Matej Nanut wrote:
>> Hello everyone,
>> I would like to know whether
>>          if (symbol in symbols)
>>                  return symbols[symbol];
>> is any less efficient than
>>          auto tmp = symbol in symbols;
>>          if (tmp !is null)
>>                  return *tmp;
>> Without optimisation, it looks like the first example
>> searches for `symbol' twice.
> Of course it does. in does a search and returns a pointer to the element in
> the AA (or null if it isn't there). The subscript operator also does a search,
> returning the element if it's there and blowing up if it's not
> (OutOfRangeError IIRC without -release and who-knows-what with -release). So,
> if you use in and then the subscript operator, of course it's going to search
> twice. Part of the point of using in is to not have to do a double lookup
> (like you would be doing if AAs had a contains function and you called that
> prior to using the substript operator).
> The correct way to do it is the second way, though you should be able to
> reduce it to
> if(auto tmp = symbol in symbols)
>      return *tmp;
> - Jonathan M Davis

I think this is the single most ugly thing in the language. IIRC ldc 
will generate identical code for both code snippets.

More information about the Digitalmars-d-learn mailing list