• ベストアンサー

C++でコンテナを扱う際の質問です。

C++でコンテナを扱う際の質問です。 確保されるメモリ位置が最後まで保証されているコンテナは存在するのかを知りたいです。 Vectorは連続性が保障されていることから間違いなくアドレスは変わると思うのですが、Deque、Listなどはどうか知りたいです。 固定されているならアドレスをMapのkeyのように扱えるかも?などと考えた次第です。 Dequeだと削除しないかぎり変わらないよ!などといった条件がある場合はそれも教えていただけると尚嬉しいです。 よろしくお願いします

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

コンテナなどは、連続性といっても見かけの連続性だけを保証するのが普通です。 その意味からは、物理的なアドレスが固定されているかどうかは断言できません。 そういうわけで、コンテナの場合は、ポインタ経由ではなくて、イテレータ経由でアクセスするわけです。 ただ、deque は、[] をサポートしているので、 std::deque<int> que; に対して、 que[0], que[1] などは、期待通りの動作をするはずです。(未確認) 残念ながら、list は、[] をサポートしていませんので、同じ記述はできません。 もともと、配列のレベルであっても、連続性は厳密には、 ・ &a[n] - &a[m] が、n - m に等しくなる ・ ptr = &a[n] のとき、*(ptr + m) は、a[n + m] をポイントする ということであって、あからさまに、物理的なメモリのアドレスは出てこないですから。 なので、ポインタ同士の減算も、「両方のポインタが同じ配列にあるか、一度に malloc() された同じ領域をポイントしている場合」しか、保証されていなかったりします。

asha1234
質問者

お礼

>>その意味からは、物理的なアドレスが固定されているかどうかは断言できません。 欲しかった言葉がいただけて光栄です。 Listは挿入や削除を行った直後でも前後のイテレータの内容が保障されているという説明を聞いたことがあり、 物理的なアドレスも固定されておりお互いのアドレスを相互に睨み合っているものなのだろうか?と疑問に思っておりました。 (イテレータを用いているのはSTLの操作としてある程度の規格を保つため?と勝手に想像) 説明を読ませていただいて、コンテナや配列の物理アドレスはイメージしていたものより全然緩いことが分かりました。 ありがとうございました。

その他の回答 (2)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

大雑把には「操作によってイテレータが無効になるかどうか」を基準に判断すればいいんじゃないでしょうか. 確かに「将来的に変わりえる」とはいえ, この辺のデータ構造はある意味「できあがっている」ものなのでそうそう変化しないと思います.

  • SaKaKashi
  • ベストアンサー率24% (755/3136)
回答No.1

現在の仕様がそうだとして、将来もそうだと言う保証はないが、それでもいいのですか?

asha1234
質問者

補足

はい。構いません。 知識として知りたいという部分もあります。

関連するQ&A