問題:
人々はこれについて不平を言っています: STL マップでは、[] よりも map::insert を使用する方が良いですか?
アクセス時
std::map<Key, ExpensiveDefaultConstructorValue> data;
data[key1] // <-- Calls default constructor each time it is called,
// even when the element is there
実装はシンプルで洗練されていますが、完全に非効率的です (unordered_map から引用)。
_Tp& operator[](const key_type& __key)
{ return _M_ht.find_or_insert(value_type(__key, _Tp())).second; }
明白な解決策
_Tp& operator[](const key_type& __key)
{ return _M_ht.find_or_insert_default(key_type(__key)).second; }
find_or_insert_default
必要な場合にのみ呼び出す場所_Tp()
(つまり、要素が存在しない場合)
なぜだめですか?
この悲観的なアプローチによって、新しい要素が必要であることに気付く前に新しい要素を構築することによって引き起こされる可能性のある他の問題はありますか?
これは標準ライブラリであり、最適化するために多大な努力を払う必要があります。この単純なアプローチを使用しないのはなぜですか?