最近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で質問しましょう!
似たような質問が見つかりました
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
- PHP 配列の値の更新方法について 1 2022/08/05 09:49
- その他(プログラミング・Web制作) pythonのmap、結果の利用は1度だけ? 5 2022/06/11 12:33
- その他(プログラミング・Web制作) python 3.10で 同じlistに同じ構文で同じデータ代入した結果が異なる現象発生 7 2022/06/18 11:08
- PHP style.cssのjQuery条件付きcssが機能しない 4 2022/07/17 18:27
- PHP PHPでCSVを出力するさいに、ループの中で前の行の値を変更したい 3 2022/10/27 17:44
- 邦楽 ほぼ罪人悪人だらけの皆さんは、誰のどのような曲を聴いて、心を浄化・平静に保っている? 6 2022/05/20 15:01
- その他(プログラミング・Web制作) このプログラミングをどう組みますか? Googlecolabでやってるんですが、出来る方お願いします 1 2022/07/13 10:52
- PHP PHPでCSVを出力するさいに、ループの中で前の行の値を変更したい 1 2022/10/27 14:21
- その他(IT・Webサービス) html cssについて 3 2023/05/13 12:48
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語 配列の長さの上限
-
配列を使わずに、変数名を動的...
-
C言語初心者 構造体 課題について
-
ExcelVBAで質問です。離れた二...
-
配列で格納したものをmsgboxで...
-
C# Listを使わずに2次元配列の...
-
配列を含む構造体の初期値について
-
unsigned char配列への入力の仕方
-
C言語で特定列だけを抽出して配...
-
配列の参照渡しで型が一致しま...
-
複数の選択範囲の行番号を個別...
-
パイソンの
-
スマホの数字キーをISOの配置に...
-
VBでC言語のポインタみたい...
-
C言語初心者 ポインタについて...
-
配列をEraseしてもメモリが開放...
-
C言語 配列の再初期化
-
VB.NET 構造体の配列の検索機能...
-
擬似コード 長さがmの配列でな...
-
【速いブラインドタッチ】手を...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語 配列の長さの上限
-
配列の参照渡しで型が一致しま...
-
配列を使わずに、変数名を動的...
-
VBで構造体の配列を関数に渡す...
-
配列で格納したものをmsgboxで...
-
unsigned char配列への入力の仕方
-
C# Listを使わずに2次元配列の...
-
C# 配列の変数宣言について。
-
擬似コード 長さがmの配列でな...
-
【速いブラインドタッチ】手を...
-
パイソンの
-
C言語初心者 ポインタについて...
-
ExcelVBAで質問です。離れた二...
-
配列を含む構造体の初期値について
-
複数の選択範囲の行番号を個別...
-
Functionの戻り値を2次元配列...
-
C++ vectorに配列をプッシュしたい
-
先頭アドレスとは何ですか?
-
テキストファイルから文字列を...
-
Redimした動的配列はEraseする...
おすすめ情報