次のようなキーと値のペアのコレクションを作成する必要があります。
map<const int, string[]> myMap; // psuedo code
それについて最善の方法は何ですか?
次のように1行で初期化できる方法はありますか?
myMap.Insert(1, new string[]{ "stack", "is", "awesome" }); // pseudo code
ユーティリティ関数make_pairを使用できます。
myMap.insert(make_pair(1,"stack"));
が必要な理由がわかりませんstring []
。一意のキーによって参照される複数の文字列を持つことができますが、それはstd::map
?を選択する目的ではありません。なぜ配列が必要なのか、それstd::map
をすでに提供しています。
置き換えるか作成するかを気にしない場合は、 を使用してoperator[]
ください。
std::map<int, std::string> mymap;
mymap[1] = "stack is awesome";
また、マップ内でポインターを使用しないでください。またはstd::multimap
、同じキーを持つ複数の要素に使用します。
例std::multimap
:
int main() {
std::multimap<int, std::string> mymmap{{1, "stack"},
{1, "is"},
{1, "awesome"}};
auto range = mymmap.equal_range(1);
for (auto i = range.first; i != range.second; ++i)
{
std::cout << (*i).second << std::endl;
}
}
int
現在使用している構造 (キーとして、関連する値として s のコレクション)に大まかに固執することにしたと仮定すると、string
おそらく値として使用したいstd::vector<std::string>
ので、map
次のように定義されます。
std::map<int, std::vector<std::string> > mymap;
この場合、配列のような表記法を使用して挿入を行うのがおそらく最も簡単です。
mymap[1] = {"String", "is", "awesome"};
現状では、これは C++11 の中括弧付き初期化子リストの使用に依存しています。これは最新のコンパイラ (gcc 4.7.0 など) では機能しますが、C++11 にまだ準拠していない古いコンパイラ (VC++10、VC++11 ベータなど) では失敗します。
std::multimap を見てください。ユースケースにより適している場合があります。
multimap<int, string> mm;
同じキーに対して複数の値を保持できることを除いて、map と同じです。これは通常、一意性を強制しないバイナリ ツリーによって実装されます。
http://en.cppreference.com/w/cpp/container/multimap
または、次を使用できます。
map<int, vector<string>> m;
次のように初期化できます。
map<int, vector<string>> m {
{ 1, { "stack", "is", "awesome" } },
{ 42, { "foo", "bar", "baz" } }
};