This is the mail archive of the libstdc++@gcc.gnu.org mailing list for the libstdc++ project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: tr1::hashtable::operator[]


Hi Peter,

       operator[](const K& k)
       {
        Hashtable* h = static_cast<Hashtable*>(this);
-       typename Hashtable::iterator it =
-         h->insert(std::make_pair(k, mapped_type())).first;
+
+        typename Hashtable::iterator it = h->find(k);
+        if (it == h->end())
+          it = h->insert(std::make_pair(k, mapped_type())).first;
        return it->second;
       }
     };

I guess if it was ok to have a bit of extra overhead when using operator[] for only inserting in std::map than it would be fine here as well.

Frankly, I'm not fully convinced, I think we should work on this a little more. For one, ext/hash_map (the closest relative) also doesn't use find. Moreover, map, which indeed do use find (lower_bound) then calls *insert with hint*. It seems to me that in our case we are not talking about "a bit of extra overhead", because we are essentially doing an additional completely redundant lookup (in case the element is not present).


Maybe a slightly larger rework of this code is in order, something very similar to the current insert but delaying the construction of the pair...

Did you benchmark the effect of your patch together with a lightweight mapped_type()?

Paolo.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]