1
Class Base {
public:
    std::map<std::string, std::string> animals;
};

次のうち、std::map<> をインスタンス化する正しい方法はどれですか?

Derived::Derived() {
    animals["Rabbit"] = "Killer Rabbit";
    //or
    animals.insert( std::pair<std::string,std::string>("Rabbit","Killer Rabbit") );
}
4

3 に答える 3

6

関数内では、次のいずれかを行う必要があります。

animals["Rabbit"] = "Killer Rabbit";

またはこれ:

animals.insert(std::make_pair("Rabbit", "Killer Rabbit"));

C++11 では、上記の後者の形式は次のように短縮できます。

animals.insert({"Rabbit", "Killer Rabbit"});

C++11 では、ペアをインプレースで構築する別の可能性も提供されます。

m.emplace("test1", "t2");

Shakurovがコメントで正しく言及しているように、最初のフォームと残りのフォームの主な違いは、"Rabbit"キーに関連付けられている値が既に存在する場合、最初のフォームはその値を上書きしますが、他のフォームは上書きしないことです。

また、 Dave Sが指摘したように(再びコメントで)、最初のフォームは値をデフォルトで構築し、後でそれを割り当てますが、他の 3 つのフォームには当てはまりません。

于 2013-04-01T14:06:55.887 に答える
1

答えは、何が起こるかによって異なります...

animals.insert(std::make_pair("Rabbit", "Killer Rabbit"));キー"rabbit"がすでに使用されている場合、これは失敗します。これを参照してください。

メソッドはanimals["Rabbit"] = "Killer Rabbit";常にanimals["Rabbit"]要素を変更します。operator[] リファレンスを見てください。

前の方法には利点があります。キー値の検索を開始する場所を指定できるということです。これにより、時間を節約できる可能性があります。

于 2013-04-01T14:20:49.483 に答える
0
Class Derived {
Public:
    Derived(){ animals["Rabbit"] = "Killer Rabbit";}

動作します。2 番目のバリアントは、正しく使用すると、より効率的になる可能性があります。違いは、ここではペア "Rabbit","" を挿入し、それを "Rabbit","Killer Rabbit" に変更し、2 番目の挿入で最終値を指示することです。

于 2013-04-01T14:09:06.343 に答える