1

次のようなキーと値のペアのコレクションを作成する必要があります。

map<const int, string[]> myMap; // psuedo code

それについて最善の方法は何ですか?
次のように1行で初期化できる方法はありますか?

myMap.Insert(1, new string[]{ "stack", "is", "awesome" }); // pseudo code
4

4 に答える 4

1

ユーティリティ関数make_pairを使用できます。

myMap.insert(make_pair(1,"stack"));

が必要な理由がわかりませんstring []。一意のキーによって参照される複数の文字列を持つことができますが、それはstd::map?を選択する目的ではありません。なぜ配列が必要なのか、それstd::mapをすでに提供しています。

于 2012-05-28T04:42:19.773 に答える
1

置き換えるか作成するかを気にしない場合は、 を使用して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;
    }
}
于 2012-05-28T04:49:27.393 に答える
1

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 ベータなど) では失敗します。

于 2012-05-28T06:05:32.163 に答える
1

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" } }
};
于 2012-05-28T06:15:33.683 に答える