- 締切済み
std::listの代入について
最近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文を回すしかないのでしょうか? 質問が多く拙文でお恥ずかしいのですが、よろしければご回答お願い致します。
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- Tacosan
- ベストアンサー率23% (3656/15482)
「大きなデータのやりとりはポインタ(又は参照)でした方が良い」ってのはその通り. ただ, 「配列は膨大な量になるからポインタで渡せ」 だと「配列」に限定しちゃってる. そうすると, 今の例のように「配列がどこにも出てこない」状況で言われても「何を言ってるんだ」ということになる. そもそも C++ において配列をポインタ以外でどう渡すのかってところから疑問だったりするわけだが. あと, #2 は SetListInt のなかで list_int = *temp_list; としているところを「全部の要素がコピー」と言ってるんだと思う. 実際, ここは全部コピーしちゃってるよね. 以下個人的な意見だけど, const でもらうなら nullptr を使いたいとかの特殊な事情がない限りポインタより参照の方が自然じゃないかなぁ.
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
> 配列は膨大な量になるからポインタで渡せとお聞きしたのですが list<T> は配列じゃないよ。
補足
listやvector等は配列とは全く違うものなんですね。言い表せられる言葉が配列と思い浮かんだので使用しました。失礼しました。
- Tacosan
- ベストアンサー率23% (3656/15482)
? 「配列は膨大な量になるからポインタで渡せ」であなたが何を言いたいのか, さっぱりわからない. どこにそんなことが書いてあったのかもわからんし, そもそも今の文脈ではどこにも「配列」が出てきていないんだけど. この形では参照にしとけばいいようにしか思えない.
補足
大きなデータのやりとりはポインタ(又は参照)でした方が良いと思うのですが間違っていますか? listやvector等は配列とは全く違うものなんですね。言い表せられる言葉が配列と思い浮かんだので使用しました。失礼しました。 ポインタですとポインタで渡してるのが視覚的に分かる為好んで使っています。ので可能ならばポインタでやりたいのです。
- 麻野 なぎ(@asano_nagi)
- ベストアンサー率35% (42/120)
とりあえず、 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同士を代入しても全く同じものになると考えてもよろしいですか? これはポインタで渡っていないのですか? ポインタ自体まだ理解し得てないところが多いです...
- Tacosan
- ベストアンサー率23% (3656/15482)
そもそもなんでポインタで渡しているのかがよくわからんが.... とりあえず, 仕様を読んでください.
補足
引数ですか? 配列は膨大な量になるからポインタで渡せとお聞きしたのですが
補足
私用で度々遅れてしまいすいません。 配列という表現に関しては齟齬が生まれてしまい申し訳ないです。 あ、なるほどです。 たしかに代入するとデータの移動と同じ事になってしまいますよね... しかし、ポインタ元の情報が意図しない書き換えがないとは保証がなく、クラスが独立して値を持ちたいとなると代入するしかないですよね?