- ベストアンサー
C++でコンテナを扱う際の質問です。
C++でコンテナを扱う際の質問です。 確保されるメモリ位置が最後まで保証されているコンテナは存在するのかを知りたいです。 Vectorは連続性が保障されていることから間違いなくアドレスは変わると思うのですが、Deque、Listなどはどうか知りたいです。 固定されているならアドレスをMapのkeyのように扱えるかも?などと考えた次第です。 Dequeだと削除しないかぎり変わらないよ!などといった条件がある場合はそれも教えていただけると尚嬉しいです。 よろしくお願いします
- みんなの回答 (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() された同じ領域をポイントしている場合」しか、保証されていなかったりします。
お礼
>>その意味からは、物理的なアドレスが固定されているかどうかは断言できません。 欲しかった言葉がいただけて光栄です。 Listは挿入や削除を行った直後でも前後のイテレータの内容が保障されているという説明を聞いたことがあり、 物理的なアドレスも固定されておりお互いのアドレスを相互に睨み合っているものなのだろうか?と疑問に思っておりました。 (イテレータを用いているのはSTLの操作としてある程度の規格を保つため?と勝手に想像) 説明を読ませていただいて、コンテナや配列の物理アドレスはイメージしていたものより全然緩いことが分かりました。 ありがとうございました。