using namespace std; struct Hoge final { int a; char name[3]{}; // 要素を0で初期化 }; int main() { Hoge a{}; a.a = 10; a.name[0] = 'a'; a.name[1] = 'b'; std::vector<Hoge> v1{}; v1.push_back(a); // Hogeのコピーコンストラクタが実行される std::vector<Hoge> v2{}; v2 = v1; // vectorのコピー。各要素をコピーする度、Hogeのコピーコンストラクタが実行される // コピー元を書き換えてみる a.a = 3; v1.at(0).name[1]='c'; // コピー先を出力 cout << v2.at(0).a << endl; cout << v2.at(0).name << endl; } 実行結果 10 ab
配列を含むvectorをv2 = v1でコピーしたら、要素毎にコピーコンストラクタが実行され、メンバ変数nameの全要素もコピーされているので、コピー元を書き換えても問題ないっぽい。
nameの先頭ポインタだけがコピーされるシャローコピーではなく、ディープコピーされている?
少なくとも、char[]に関しては問題なく全要素コピーされている模様。
ただし、もし、Mosa* ptrのように、メンバ変数にポインタを保持している場合は、ポインタの先頭アドレスしかコピーされず、コピー先の編集がコピー元に影響を与えるなどが発生するのではなかろうか(要確認)
追記
v2 = v1よりもstd::copyを使った方がよさげ。
std::vector<Hoge> v2{}; v2.clear(); // 繰り返し呼び出すような箇所はクリア必須 v2.reserve(v1.size()); // なくてもいいが、こちらの方がcapacityがコピー元配列のsize未満だった場合にallocationが発生するのを予防でき、メモリ断片化を防げるらしい。 std::copy(v1.begin(), v1.end(), std::back_inserter(v2));
コメントを残す