2012-12-15 11 views
5

STLに関するいくつかのドキュメントを読んでいましたが、end()関数は、のイテレータをコンテナの最後の要素の次に返します。STL iterators:container.end()

そして、コンテナが使用可能なメモリ全体の最後のバイトを占有している場合はどうでしょうか。その後何が起こるでしょうか?

+0

ポインタは一種の反復子であり、逆もありません。 –

+0

@BenjaminLindleyあなたはなぜこれがそうだと教えていただけますか?私は初心者です... – Kolyunya

+0

私はちょうどニトウキビです。私が得たのは、ポインターだけでなく、イテレーターには多くの種類があるということです。したがって、「イテレータはポインタです」というケースではありません。 *いくつかのイテレータはポインタであり、いくつかはポインタではありません。逆の言い方をすれば、「ポインタはイテレーター」です。それは真実です。少なくとも、それは私が暗示しようとしていたものです。しかし、それは実際には真実ではありません。ポインタの中にはイテレータではないものもあれば、参照の型として使われるものもあります。だから私は間違っていた。 –

答えて

4

C++メモリモデルは、配列の最後の要素の後に常に要素へのポインタを作成できることを保証します。存在しない場合、システムは、この場所にオブジェクトを割り当てることも、ラップアラウンドすることもできません。また、配列の潜在的な問題であることに注意してください。他のコンテナは、他の適切な形式で終わりの位置を処理するイテレータ・タイプを使用できるため、増分操作の動作を完全に制御します。

+0

これは、私が配列を作ることを許されないことを意味しています。少なくとも1バイトは残す必要がありますか?それは正しいのですか? – Kolyunya

+0

@Kolyunya:C++のデザインはそれを防ぐものではありませんが、ほとんどのOSはそれを許しません。 –

+1

@ Kolyunya:16ビットの組み込みシステムで作業していて、位置が0xFFFEの16ビット整数を持つ配列を作成したとします。 1つの整数(2バイト)を加算し、0x0000になるようにラップアラウンドします。イテレータの簡単な比較を行うと、それらは0とi == end()です。すべては順調です。 –

3

最後のイテレータ(少なくとも比喩的に)はちょうどを指し、はコンテナの終わりを示します。コンテナ内の有効な項目は、*container.begin()から*container.end()-1までです。言い換えれば

、あなたはthey'rが等しいかどうかを確認するために、エンドイテレータに他のいくつかのイテレータを比較することができます(あなたは、コンテナ内のアイテムの終わりに達したことを示していますどの)、しかし、あなたができるないそのイテレータを参照解除します(つまり、参照先のアイテムにアクセスしないでください)。

編集:申し訳ありませんが、誤解を招くような質問:コンテナが実際にメモリの最後のバイトを使用している(まれにはありませんが、理論的には可能です)もちろん、それは実際にアドレスの面で機能するイテレータであったと仮定します。そのような場合は通常、有効なアドレスと区別できる0のアドレスになります(つまり、0は有効なポインタではないヌルポインタに変換されます)。

しかし、典型的なケースでは、そのようなことは起こらない可能性が高いです。たとえば、ほとんどの32ビットシステムでは、ユーザーは最初の2〜3ギガバイトのアドレス空間を使用するように制限されており、上位アドレスはオペレーティングシステム用に予約されています。

+0

さらにメモリアドレスがなくても何が起こるか質問しています。したがって、イテレータは物理的に存在しないメモリを指しています。 – Mosby

+0

最後の要素がメモリ内の最後のバイトを指している場合はどうなりますか? .end()は何を(少なくとも比喩的に)指しますか? – Borgleader

+0

@Borgleader:何も問題ありません。 – rici