-1

イテレータを使用してテンプレート配列を実装し、イテレータの一部の演算子をオーバーラッドする割り当てを受けましたが、いくつか質問があります。私が理解していることから、stdランダムアクセスイテレータにより、配列を超えることができます。サイズを超えて保持している値を取得できますか? ユーザーがそのメモリに上書きすることはできますか?

私の実装では、サイズを介したアクセスを許可する必要がありますか? サイズからデータを取得できるようにする必要がありますか? 変更を許可する必要がありますか?

この場合、良いプログラミングとは何ですか?

どんな助けでも大歓迎です

4

5 に答える 5

2

イテレータが実行する実行時チェックの量は、イテレータ次第です。ライブラリの設計哲学の一部は、高レベルの型チェックでほぼ手作業でコーディングされたコンテナのパフォーマンスを提供することであるためstd、ライブラリ イテレータは通常、実行時チェックをほとんど行いません。std

ただし、多くのstdライブラリ実装には、デバッグ ビルドのオプションとして複数レベルの実行時チェックが含まれています。これは、無効なイテレータの内容を要求すると、stdイテレータが未定義の動作を呼び出し、おそらくバッファの終わりを過ぎたランダム メモリの内容、または場合によっては segfault を返すことを意味します。書き込むと、書き込みが許可されていないメモリに喜んで書き込みます。

イテレータを作成するときは、イテレータ内にデバッグ ツールを含めることをお勧めします。最初は正しく記述できないからです。ライブラリ イテレータ デバッグ ツールは主にstd、イテレータのユーザーが間違いを犯していることを発見することを目的としていますが、イテレータの作成者 (つまり、あなた) が間違いを犯しているかどうかを判断するために行うチェックの種類も同様です。

このようなチェックを含める場合と含めない場合の両方を実行することをお勧めします。また、イテレータを開発するときは、そのようなチェック (例外、アサート、または単にエラー ログ システムに接続されたもの --cerrこのコンテキストではエラー ログと見なされます)を確実に含める必要があります。プロダクション」コード。

于 2013-06-04T11:48:21.783 に答える
1

オーバーフローの場合、サイズは重要ではありません。ランダム アクセス反復子とは、operator[] を使用して要素をルックアップするか、operator += または + または -= または - を使用して任意の量だけインクリメントまたはデクリメントできることを意味します。

ここで必要なすべての操作を表示しますhttp://www.cplusplus.com/reference/iterator/RandomAccessIterator/

于 2013-06-04T11:45:05.553 に答える
1

標準 C++ ライブラリ (以前は STL と呼ばれていました) では、反復子は、C ポインターが範囲チェックを実行しないのと同じ方法で範囲チェックを実行しません。割り当てられた境界を超えて指すイテレータを介してメモリにアクセスすることは、未定義の動作です。割り当てられた境界を超えて指すポインタを介してメモリにアクセスすることは、未定義の動作です。イテレータの設計においても同じ原則に従う必要があります。つまり、データ アクセスに対して境界チェックを実行しないでください。

于 2013-06-04T11:46:46.067 に答える
1

あなたは課題を読みすぎていると思いますが、それでもあなたの質問は考慮に値します。

まず、いくつかの考慮事項:

  • 変化するイテレータと変化しないイテレータ (iteratorおよびconst_iterator一般にネストされた型) の両方があり、前者はポイント先の要素への書き込みを許可し、後者は許可しません。
  • イテレータは軽量であると想定されており、多くのアルゴリズムで何度もコピーされています

さて、あなたの質問に関しては、境界チェックを実行するかどうかについて、実際に設計上の決定があります。

一般に、C++ の反復子は非常に軽量であるため、境界チェックをまったく実行しません。これが効率の名であり、使わないものにはお金を払わないという哲学です。ユーザーがオーバーシュートした場合... 彼女はUndefined Behaviorの餌食になります。それは何でも起こる可能性があります。

ただし、ほとんどの (すべてではないにしても) STL 実装も問題を認識し、アプリケーションのテスト時に使用できるデバッグ モード (チェック モード) を提供します。もちろん、これらは CPU に関してだけでなく、潜在的にメモリに関しても追加のコストを引き起こします。

そのため、チェックを提供するかどうかはユーザー自身の選択であり、場合によってはオプションで提供することもできます。チェックなしで開始することをお勧めします。システムがどのように見えるかをよりよく理解できるように、後でチェックするだけです。

于 2013-06-04T11:50:44.437 に答える