• 締切済み

vector操作でコピーコンストラクタの抑制

std::vector<std::vector<MyData>> vecvec; とした場合、vecvec.insert() / erase() でも MyData のコピーコンストラクタは走らないのですが、 struct MyVector { std::vector<MyData> vec; }; std::vector<MyVector> vecMyVec; とした場合、vecMyVec.insert() / erase() で、MyData のコピーコンストラクタが走ります。 MyVector が、何らかの継承と実装をすれば、回避できると思うのですが、 その方法を知ってる方がいらしたら教えてください。

みんなの回答

  • hidebun
  • ベストアンサー率50% (92/181)
回答No.1

>vecvec.insert() / erase() でも MyData のコピーコンストラクタは走らない これは、MyDataを格納したvectorを、insert/eraseしようとするのですよね? つまり、vecvecは、MyDataを格納したvectorのポインタの格納リストになるわけですね。 入出力対象が、ポインタなので、単に値をコピーするだけですが、vecMyVecの場合は、 MyVectorというクラス(構造体)が入出力対象なので、vector側も渡されたオブジェクトを 自分の領域に格納する時にコピーするしかない。その時に、コピーコンストラクタを使う。 また、vectorの場合は、メモリが連続に配置される必要があるので、eraseを行うと、 eraseした箇所以降のMyVectorオブジェクトを一旦、全てデストラクタで破棄してから、 再度、オブジェクトの生成・コピーをやり直す、その時に、コピーコンストラクタが 使われる…。 コピーコンストラクタだけでなく、デストラクタも何回も呼ばれるんじゃないかと思いますが、どうでしょう? #全然C++をいじってないので、だいぶ忘れていますが。。 というわけで、std::vectorにオブジェクトを格納するときは、コピーコンストラクタは必須。 std::list<MyVector>とかだと、コピーコンストラクタとかデストラクタの呼ばれる回数とかは、変わってくると思いますが。 さて、どんなもんでしょう。 #間違っていたら、つっこんで下さい>皆様 vectorの場合は、メモリを連続領域に配置できないときには、全オブジェクトを破棄して、コピーし直すと思うので、insertやeraseだけでなく、場合によっては、push_backでも、 デストラクタやコピーコンストラクタが動くと思いますよ。

関連するQ&A