電子書籍の厳選無料作品が豊富!

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 が、何らかの継承と実装をすれば、回避できると思うのですが、
その方法を知ってる方がいらしたら教えてください。

A 回答 (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でも、
デストラクタやコピーコンストラクタが動くと思いますよ。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!