連想コンテナ(5)

コンテナにオブジェクトの実体を入れる場合,Insertに参照渡しをしても,insertでもpush_backでもコピーコンストラクタが3回呼ばれる.

v.insert( it, Item(key, data));
   // 1.Item(key, data)で作成,
insertが _Insert_n(_Where, (size_type)1, _Val); を呼び出す.
   // 2._Valがシーケンス内を指している場合に備えてコピーする.
   //   シーケンス内を指していなければ無駄なのに…
   // 3.シーケンス内にコピーする

さらにvectorにリサイズが発生すると,全部コピーしなおすことになる.


vc8の実装では,push_back(X)は insert( end(), X);と定義されているので当然同じ回数のコピーコンストラクタが呼び出される…

if (it==v.end()) v.push_back(X); else v.insert( it, X);

で少しは改善できると思ったのに.

しかも複数サイズのコピー( void insert( iterator _Where, size_type _Count, const Type& _Val); )も同じ扱いなので,想像以上に大きな関数になっている.
複数サイズのコピー自体はコンパイラの最適化によって妥当なサイズに縮小される?

コンテナにオブジェクトの実体を入れるときは要注意だな.