最近std::listを勉強し始めたのですが質問があります。
あるクラスに以下を用意しました。
メンバ変数
std::list< int > list_int;
メンバ関数
void SetListInt( const std::list< int > *temp_list ){ list_int = *temp_list; }
以下質問内容です。
・この SetListInt 関数の場合 temp_list の先頭のみが代入されますか?
・また, temp_list の元の場所が削除または変更されても list_int の中身(この場合は先頭のみ?)は変わらないですよね?
・引数で貰って中身を全部代入したいならイテレータでfor文を回すしかないのでしょうか?
質問が多く拙文でお恥ずかしいのですが、よろしければご回答お願い致します。
A 回答 (5件)
- 最新から表示
- 回答順に表示
No.5
- 回答日時:
「大きなデータのやりとりはポインタ(又は参照)でした方が良い」ってのはその通り. ただ,
「配列は膨大な量になるからポインタで渡せ」
だと「配列」に限定しちゃってる. そうすると, 今の例のように「配列がどこにも出てこない」状況で言われても「何を言ってるんだ」ということになる.
そもそも C++ において配列をポインタ以外でどう渡すのかってところから疑問だったりするわけだが.
あと, #2 は SetListInt のなかで
list_int = *temp_list;
としているところを「全部の要素がコピー」と言ってるんだと思う. 実際, ここは全部コピーしちゃってるよね.
以下個人的な意見だけど, const でもらうなら nullptr を使いたいとかの特殊な事情がない限りポインタより参照の方が自然じゃないかなぁ.
この回答への補足
私用で度々遅れてしまいすいません。
配列という表現に関しては齟齬が生まれてしまい申し訳ないです。
あ、なるほどです。
たしかに代入するとデータの移動と同じ事になってしまいますよね...
しかし、ポインタ元の情報が意図しない書き換えがないとは保証がなく、クラスが独立して値を持ちたいとなると代入するしかないですよね?
No.3
- 回答日時:
?
「配列は膨大な量になるからポインタで渡せ」であなたが何を言いたいのか, さっぱりわからない. どこにそんなことが書いてあったのかもわからんし, そもそも今の文脈ではどこにも「配列」が出てきていないんだけど.
この形では参照にしとけばいいようにしか思えない.
この回答への補足
大きなデータのやりとりはポインタ(又は参照)でした方が良いと思うのですが間違っていますか?
listやvector等は配列とは全く違うものなんですね。言い表せられる言葉が配列と思い浮かんだので使用しました。失礼しました。
ポインタですとポインタで渡してるのが視覚的に分かる為好んで使っています。ので可能ならばポインタでやりたいのです。
No.2
- 回答日時:
とりあえず、
void SetListInt( const std::list< int > *temp_list ){ list_int = *temp_list; }
と
void SetListInt( const std::list< int > temp_list ){ list_int = temp_list; }
で、同じ事が起こりますから、「全部の要素がコピー」されます。
なので、
> 配列は膨大な量になるからポインタで渡せとお聞きしたのですが
ということを聞きかじったにしては、「ポインタで渡ってない」ので、膨大な量のコピーが発生します。
※もっとも、気にするほどの「膨大な量」かどうかは疑問ですが。
あと、配列と、list を含む、(STLのような)コンテナクラスというのは、別物です。
配列のように、「ほとんどあらゆるところで、配列名は配列の先頭アドレスに読み替えられる」ということはなく、ちゃんと、ひとまとまりの「コンテナ」として機能します。
なので、*temp_list という「リストの中身」は、「リストの中身丸ごと」です。
この回答への補足
返事が遅れてしまい申し訳ありません。
配列と違って先頭だけでは無く中身をそのまま代入できるのですね。
要素数の違うlist同士を代入しても全く同じものになると考えてもよろしいですか?
これはポインタで渡っていないのですか?
ポインタ自体まだ理解し得てないところが多いです...
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語 配列の長さの上限
-
C# 配列の変数宣言について。
-
VB.NETでテキストボックスをコ...
-
先頭アドレスとは何ですか?
-
C言語で特定列だけを抽出して配...
-
配列を使わずに、変数名を動的...
-
乱数表示のプログラム
-
VBで動的なメモリの確保
-
配列で格納したものをmsgboxで...
-
最大値・最小値の求め方 配列
-
スマホの数字キーをISOの配置に...
-
unsigned char配列への入力の仕方
-
C++ 配列を返すには?
-
テキストファイルから文字列を...
-
VBからDLLへ多次元配列を渡す/...
-
配列の参照渡しで型が一致しま...
-
C# Listを使わずに2次元配列の...
-
配列を含む構造体の初期値について
-
【エクセルVBA】Functionの引数...
-
VB.NET 構造体の配列の検索機能...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語 配列の長さの上限
-
配列を使わずに、変数名を動的...
-
配列で格納したものをmsgboxで...
-
C# 配列の変数宣言について。
-
C# Listを使わずに2次元配列の...
-
配列をEraseしてもメモリが開放...
-
unsigned char配列への入力の仕方
-
Redimした動的配列はEraseする...
-
配列の参照渡しで型が一致しま...
-
先頭アドレスとは何ですか?
-
【C言語】配列の中に配列を入れ...
-
ExcelVBAで質問です。離れた二...
-
複数の選択範囲の行番号を個別...
-
VBで構造体の配列を関数に渡す...
-
C言語で特定列だけを抽出して配...
-
配列を含む構造体の初期値について
-
テキストファイルから文字列を...
-
【速いブラインドタッチ】手を...
-
VBでC言語のポインタみたい...
-
メモリの初期値
おすすめ情報