1. ホーム
  2. c++

[解決済み] 地図に挿入する際の好ましい/慣用的な方法は何ですか?

2022-05-03 01:18:29

質問

に要素を挿入する4つの異なる方法を確認しました。 std::map :

std::map<int, int> function;

function[0] = 42;
function.insert(std::map<int, int>::value_type(0, 42));
function.insert(std::pair<int, int>(0, 42));
function.insert(std::make_pair(0, 42));

どれが好ましい/慣用的な方法なのでしょうか?(また、私が思いつかないような別の方法がありますか?)

解決方法は?

まず最初に operator[]insert メンバー関数は機能的に同等ではありません。

  • operator[] 意志 検索 を挿入してください。 デフォルトで構築された の値が見つからなければその参照を返し、その参照に値を割り当てる。明らかに、これは mapped_type は、デフォルトの構築と代入の代わりに、直接初期化することで利益を得ることができます。また、この方法では、挿入が本当に行われたのか、それとも以前に挿入されたキーの値を上書きしただけなのかを判断することができません。
  • insert メンバ関数はキーが既にマップに存在する場合は何の効果もありません。 std::pair<iterator, bool> これは興味深いものです (特に、挿入が実際に行われたかどうかを判断するため)。

リストアップされたすべての呼び出しの可能性から insert は、3つとも ほとんど と等価です。念のため、次の項目を見てみましょう。 insert の署名があります。

typedef pair<const Key, T> value_type;

  /* ... */

pair<iterator, bool> insert(const value_type& x);

では、この3つのコールはどのように違うのでしょうか?

  • std::make_pair はテンプレート引数の演繹に依存しており、(この場合は とは異なる型のものを生成します。 value_type を追加で呼び出す必要があります。 std::pair に変換するために、テンプレートコンストラクタを使用します。 value_type (例) constfirst_type )
  • std::pair<int, int> のテンプレートコンストラクタを追加で呼び出す必要があります。 std::pair に変換するために、パラメータを value_type (例) constfirst_type )
  • std::map<int, int>::value_type が期待するパラメータ型であるため、疑う余地はありません。 insert のメンバー関数があります。

結局のところ、私は operator[] 挿入を目的とする場合、デフォルトの構築と mapped_type そして、新しいキーが効果的に挿入されたかどうかの判断はどうでもいいということです。また insert を構築することです。 value_type は、おそらくその方法です。