通常、何らかの方法でキーの存在を確認する必要があります。ただし、チェックを行って値を与える関数を作成することもできます。そのため、呼び出すとワンライナーになります。キーがマップに存在しない場合のデフォルト値が必要になります。そのための簡単な実装を次に示します。
template <class Map, class U>
auto getOrDefault(Map const& m, typename Map::key_type const& key, U&& default_val)
-> typename Map::mapped_type
{
auto pos = m.find(key);
return pos != m.end() ? pos->second : std::forward<U>(default_val);
}
template <class Map>
auto getOrDefault(Map const& m, typename Map::key_type const& key)
-> typename Map::mapped_type
{
typedef typename Map::mapped_type Value;
return getOrDefault(m, key, Value{});
}
//call:
int val = getOrDefault(intMap, 11); // 0 if key 11 does not exist
int val2 = getOrDefault(intMap, 42, -1); //-1 if key 42 does not exist
注:default_val
デフォルトの引数を与えることができませんでした-誰かがそれを手伝ってくれるかもしれません。gcc 4.7.2U
で試したときに推測できませんでしたU&& default_val = typename Map::mapped_type{}