4

私がこれを持っていると考えてください:

std::map<int, int> intMap;
intMap[11] = 21; 
intMap[12] = 22; 
intMap[13] = 23; 
intMap[14] = 24; 

int val = 0; 

map[11] の値を見つけたい場合は、存在する場合はそれをval使用しています。

std::map<int, int>::iterator it = intMap.find(11);
if(it != intMap.end())  
    val = it->second;

イテレータを使わずにこれを行う方法はありますか? つまり、より短い方法です。

int val = intMap[11]まだそこになかった場合、intMap のキーとして 11 が追加されるため、私にとってはオプションではありませ

4

4 に答える 4

8

C++ 11 には、マップされた値への参照を返すか、マップに存在しない場合は例外をスローするmap新しいメソッドが呼び出されます。at(Key)Key

C++ では、中間反復子が必要になります。

于 2013-06-06T12:20:00.503 に答える
2

これもうまくいくと思います:

int val;
if (intMap.count(11)) val = intMap[11];

キーの存在を簡単に確認...

したがって、Karadoc で提案されているように、default_value を含む 1 行で:

int val = (intMap.count(x) ? intMap[x] : default_value);
于 2013-06-06T12:22:37.127 に答える
0

通常、何らかの方法でキーの存在を確認する必要があります。ただし、チェックを行って値を与える関数を作成することもできます。そのため、呼び出すとワンライナーになります。キーがマップに存在しない場合のデフォルト値が必要になります。そのための簡単な実装を次に示します。

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{}

于 2013-06-06T12:47:41.933 に答える