-1

std::map を初期化する方法を理解しようとしています。私はウェブ上で地図を初期化する次の方法を見ました(そのTest& t = mylist[0]部分に注意してください):

#include <iostream>
#include <map>

using namespace std;

class Test
{
  public:
   Test():i_(0) { cout<<"Calling constructor"<<endl;}
   ~Test() { cout <<"Calling destructor"<<endl;}
  private:
   int i_;
};

int main(int argc, char **argv)
{
  map<unsigned,Test> mylist;
  cout << "Before "<<mylist.size()<<endl;
  Test& t = mylist[0];
  cout << "After "<<mylist.size()<<endl;
  return 0;
}

素朴に、私は次のように動作することを期待していました。

Test t;
mylist[0] = t;

しかし、なぜ最初の方法が機能するのかを考えると頭が痛くなります! オブジェクトはどのように初期化されますか? mylist[0];技術的に式だけを書くとオブジェクトが作成されるため、一時的なものですか (しかし、どのように?)

前もって感謝します!

4

2 に答える 2

4

cppreference.comによると:

[ std::map::operator[] ] key をキーとして使用し、デフォルトで構築されたマップ値を使用してコンテナに新しい要素を挿入し、新しく構築されたマップ値への参照を返します。キーを持つ要素がkey既に存在する場合、挿入は実行されず、マップされた値への参照が返されます。

これは、Test& t = mylist[0];が実行されたときにTest()が呼び出され (「コンストラクターの呼び出し」を見たことがあるでしょう)、このオブジェクトがのキーでmap" " に挿入されたことを意味します。これが呼び出された時点ではマップ内にそのキーを持つ要素がないため、この操作によって のサイズがちょうど 1 増加します。mylist0mylist

于 2012-12-29T08:01:22.327 に答える
1

はい、[]std::map の演算子は、値クラスのデフォルト コンストラクターを使用して新しいオブジェクトを作成します。

http://www.cplusplus.com/reference/map/map/operator[] /:

x がコンテナー内のどの要素のキーとも一致しない場合、関数はそのキーを持つ新しい要素を挿入し、マップされた値への参照を返します。これにより、マップされた値が要素に割り当てられていない場合でも、常にマップ サイズが 1 増加することに注意してください (要素は既定のコンストラクタを使用して構築されます)。

クラスにデフォルトのコンストラクターがない場合、コンパイラ エラーが発生します。

于 2012-12-29T07:59:37.413 に答える