
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件)
- 最新から表示
- 回答順に表示
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が見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# このプログラミング誰か教えてください 9 2022/04/22 18:50
- C言語・C++・C# このプログラミング誰か教えてください。 2 2022/04/22 18:48
- 画像編集・動画編集・音楽編集 PhotoScape という画像加工ソフトについて教えてください 3 2023/08/23 21:22
- ブルーレイ・プレーヤー・レコーダー BD-REについて教えてください。 3 2022/11/10 23:28
- C言語・C++・C# このプログラミング誰か教えてくれませんか 2 2022/05/14 09:45
- C言語・C++・C# このプログラミング誰か教えてくれませんか 3 2022/05/13 17:27
- ガスコンロ・IHクッキングヒーター・給湯器 コンテンツブロッカーについて 2 2023/05/17 09:43
- フリーソフト Vector フリーソフト 卓上カレンダー Windows10での作動は? 2 2022/06/11 19:03
- その他(言語学・言語) 「ベクトル」ってなんか抵抗ありませんか?「ヴェクトル」のほうがよくありませんか? 9 2023/01/01 10:50
- C言語・C++・C# メインプログラムに#include <algorithm>を書いて、 そのメインプログラムが // 3 2023/05/02 11:24
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Access VBAから使用したExcelプ...
-
Eclipseのコード入力時の、行コ...
-
C++言語で、構造体のコピーは可...
-
Excelでコピーしたセル(テキス...
-
DataTableに入っているデータを...
-
マウントしたディスクにcpで、...
-
Ctrl + Cなど複数の入力キー...
-
Activesheet.Pasteで困っています
-
vector操作でコピーコンストラ...
-
Listviewに表示された文字のコ...
-
VBAのコピー
-
fork()
-
ホームページ上の画像をコピー...
-
Subversionで作業一段落の作業...
-
OutlookVBAでコピーした文字を...
-
CStringArray[2]のコピー
-
Windows上のマウス操作をプログ...
-
エクセルVBA 実行時エラー'...
-
EXCEL VBAで複数行のコピー(...
-
【UWSC】WEBページ内コピーした...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Access VBAから使用したExcelプ...
-
DataTableに入っているデータを...
-
Eclipseのコード入力時の、行コ...
-
C++言語で、構造体のコピーは可...
-
Ctrl + Cなど複数の入力キー...
-
一行おきに貼り付ける 可能でし...
-
マウントしたディスクにcpで、...
-
Activesheet.Pasteで困っています
-
文字列の切り出し
-
jakarta poiを使用し、EXCELの...
-
Listviewに表示された文字のコ...
-
【UWSC】WEBページ内コピーした...
-
他プロジェクトのFormを自プロ...
-
Excelでコピーしたセル(テキス...
-
エクセルVBA 実行時エラー'...
-
VBScript でサブフォルダも含め...
-
シートに張り付けたボタンがシ...
-
Eclipseでコピーするとき行数な...
-
【再質問】Eclipseのコード入力...
-
バッチで当日日付で作成される...
おすすめ情報