2016-10-20 4 views
1

で見つからない場合、私はunordered mapを持っている:戻り、他の値のキーマップ

static unordered_map<int, long> my_map; 
auto& result = my_map[i]; 

何もキーiがない場合、結果は0だろう。 NULL-MAXINTのように他の値を返すことはできますか?

+3

使用が存在doesntの場合は何をしたいの値を設定し

:あなたはオプションのカップルを持っています'my_map.find(i)'と比較し、 'my_map.end()'と比較しますか? – Jarod42

+0

「NULL」は「0」と同じです。 –

答えて

2

結果0は、「値が見つかりませんでした」という意味ではありません。 の値はで、[]の操作で追加されました。結果は0です。これはlongのデフォルト値であり、[]操作のデフォルト設定はlongです。そして、longがどのようにデフォルトで構築されるかを変更することはできません。

あなたはちょうどあなたが10を返すmy_map.count(i)を使用する必要があり、要素が既に存在するかどうかを確認したい場合は、「このキーが存在する」という意味と、それぞれ「このキーは存在しません」。キーが存在しない場合は、my_map.insertを使用して、好きな値でキーを追加できます。

3

あなたのような何か(マップに値を挿入しません。)を行うことがあります。

template <typename Key, typename Value> 
Value& get_or(std::unordered_map<Key, Value>& m, const Key& key, Value& default_value) 
{ 
    auto it = m.find(key); 
    if (it == m.end()) { 
     return default_value; 
    } 
    return it->second; 
} 

をそれとも、存在しない場合はマップに値を追加する場合:

template <typename Key, typename Value, typename T> 
Value& get_or(std::unordered_map<Key, Value>& m, const Key& key, T&& default_value) 
{ 
    return m.emplace(key, std::forward<T>(default_value)).first->second; 
} 

をし、それを使用

int default_value = 42; 
auto& result = get_or(my_map, i, default_value); 
+1

@ LightnessRacesinOrbit:あなたは2回のルックアップをします。 – Jarod42

+0

はい、この文脈では、既存の値を使用したい場合、良い解決策です。しかし、キーと価値の普遍的な参照を取る価値がある? –

+0

@LightnessRacesinOrbit: 'Key'はとにかく' const'なので、そのように、括弧で囲まれた初期化子リストを使うことができます。参照を返す非constバージョンの場合、リファレンスを参照するのを避けるために参照の既定値をとる必要があります。 – Jarod42

2

値が存在しない場合はmy_map[i]を使用すると作成されます。したがって、デフォルトのコンストラクタとは異なるものを作成できます。またはlongの場合はデフォルト値です。

if (my_map.find(i) == my_map.end()) { 
    my_map[i] = MAX_INT; //Or whatever you want. 
} 

またはデフォルトコンストラクタを持つlongのために独自のラッパークラスを持っている:

struct DefLong { 
    long myLong; 
    long& operator() { 
     return myLong; 
    } 
    DefLong() : myLong(MAX_INT){} 
} 
.... 
static unordered_map<int, DefLong> my_map; 
auto& result = my_map[i]; 
long otheresult = my_map[i];