2016-04-26 8 views
1

map<string, vector<int>>my_mapとし、42"foo"に関連付けたいとします。ジャワから来る私が驚いたことに、この可変値のマップに追加

if (my_map.find("foo") != my_map.end()) { 
    my_map["foo"].push_back(42); 
} else { 
    vector<int> my_vector; 
    my_map["foo"] = my_vector; 
    my_vector.push_back(42); 
} 

ような何かを持っていることを期待する私は、私はちょうどこの作業を行う方法

my_map["foo"].push_back(42); 

を行うことができますことを発見? my_map["foo"]は、マップの値の型にパラメータのないコンストラクタがない場合はどうなりますか?空のコンストラクタ以外の方法ですべての値を初期化したいとします。 Javaでは、私はできるでしょう

map.computeIfAbsent("foo", **some supplier of Vectors**).add(42); 

C++には同等のものがありますか?

+2

'ベクター my_vector; my_map ["foo"] = my_vector; my_vector.push_back(42); 'あなたの' else'では、あなたは何を正確にしようとしていますか? –

+0

コンテナにはコピーが格納されます。 C++はJavaではありません。すべてがリファレンスではありません。 – user463035818

+0

"foo"が見つからない場合に要素を挿入しようとすると、新しいマップセルが作成されます。作成中に、ベクトルのデフォルトのコンストラクタが呼び出され、すでに空のベクトルを作成しています – Stefano

答えて

6

my_map["foo"]デフォルトは、まだ存在しない場合は新しい値を作成します。したがって、値の型がデフォルトで構成可能でない(つまり、パラメータを持たないコンストラクタを持たない)場合、コンパイルエラーが発生します。その後、次の操作を実行する必要があります:

それはまだ存在していなかった場合 emplaceparamからあなたの価値を構築するだろう
my_map.emplace("foo", param).first->second.push_back(42); 

複数のパラメータがstd::pairから区分コンストラクタを供給することができる。

my_map.emplace(
    std::piecewise_construct, 
    std::forward_as_tuple("foo"), 
    std::forward_as_tuple(param1, param2, param3) 
).first->second.push_back(42); 
2

あなたはoperator[]ためhereを読むことができます:

kは、コンテナ内の任意の要素のキーと一致しない場合、この関数はそのキーを持つ新しい要素を挿入し、マップされた値への参照を返します。要素にマップされた値が割り当てられていない場合でも、コンテナのサイズは常に1ずつ増加します(要素はデフォルトコンストラクタを使用して作成されます)。

mapped_typeにデフォルトコンストラクタがないと、コンパイルエラーが発生します。

関連する問題