1. ホーム
  2. c++

[解決済み] 地図に要素を挿入するおすすめの方法【重複】について

2022-10-20 17:26:42

質問

重複の可能性があります。

STLマップでは、[]よりもmap::insertを使う方が良いのでしょうか?

マップに要素を挿入する場合、どのような方法が推奨されるのでしょうか?私は

map[key] = value;

または

map.insert(std::pair<key_type, value_type>(key, value));

以下のような簡単なテストをしてみました。

#include <map>
#include <string>
#include <iostream>

class Food {
public:
    Food(const std::string& name) : name(name) { std::cout << "constructor with string parameter" << std::endl; }
    Food(const Food& f) : name(f.name) { std::cout << "copy" << std::endl; }
    Food& operator=(const Food& f) { name = f.name; std::cout << "=" << std::endl; return *this; } 
    Food() { std::cout << "default" << std::endl; }
    std::string name;
};

int main() {
    std::map<std::string, Food> m0;

/*
1) constructor with string parameter
2) copy
3) copy
4) copy
*/
    m0.insert(std::pair<std::string, Food>("Key", Food("Ice Cream")));

/*
1) constructor with string parameter
2) default
3) copy
4) copy
5) =
*/
    // If we do not provide default constructor.
    // C2512: 'Food::Food' : no appropriate default constructor available
    m0["Key"] = Food("Ice Cream");
}

  1. メンバ関数 insert を使用することで、より少ない値の関数呼び出しが関与することになります。では insert を使うのは推奨される方法ですか?
  2. なぜデフォルトのコンストラクタが必要なのでしょうか? map[key] = value の方法が使われているのに、なぜデフォルトのコンストラクタが必要なのですか?

私が知っているのは insert は存在のキー・バリュー・ペアを上書きしないことは知っていますが map[key] = value は上書きされます。しかし、両者のどちらかを選択しようとするとき、考慮すべき要素はこれだけなのでしょうか?

どうでしょう。

  1. パフォーマンス
  2. 値のデフォルトコンストラクタの可用性
  3. ???

どのように解決するのですか?

  1. insert は推奨される方法ではなく、地図に挿入する方法の1つです。との違いは operator[]insert がその要素をマップに挿入しているかどうかを判断できることです。また、クラスにデフォルトのコンストラクタがない場合、強制的に insert .
  2. operator[] がデフォルトコンストラクタを必要とするのは、マップが要素が存在するかどうかをチェックするためです。存在しない場合は、デフォルトコンストラクタを使用して要素を作成し、参照(またはそれへの const 参照)を返します。

マップコンテナはキー値の重複を許さないため、挿入操作では挿入される各要素について、同じキー値を持つ別の要素がコンテナ内にすでに存在するかどうかをチェックします。