0

STL イテレータはコンテナ クラスで使用され、コンテナに格納された特定の要素へのポインタと概念的に似ています。

以下のステートメントの 1 つが当てはまります。どれ?

  1. 通常、反復子はアドレス (ポインター) を保持し、反復子に適用された operator++ は常にそのアドレスを増やします。
  2. イテレータitがプログラムのスコープ外に出ると、it破棄され、自動的に ; が呼び出されdelete itます。
  3. 有効な STL コンテナー myC の場合、式 myC.end()-myC.begin() が適切に定義されている場合、myC.size() と同じ値を返します。
  4. コンテナがスコープ外になると、それを指すすべてのイテレータが自動的に変更されます。
  5. 有効な STL コンテナー myC の場合、myC.end() によって返される反復子は、myC の最後の有効な要素を参照します。

どうやら解決策は 3. ですが、理由がわかりません。誰かがこれが事実である理由を詳しく説明し、おそらく他の人がなぜ間違っているのかを示すことができますか?

4

1 に答える 1

3
  1. リンク リスト ( list) 内のアイテムのアドレスの要件を考えてみてください。メモリ内で連続している必要はありません。

  2. deleteポインターに対して手動で行われるものであり、(ポインターがスコープ外になった場合でも) (一部の API で行われない限り) 自動的には行われません。イテレータは (一般に) クラスであるため、delete適用されません。ただし、イテレータは破壊されます。

    おそらくポインターを反復子として分類することもできます。ただし、deleteまだ自動的には呼び出されません。

  3. これはランダム アクセス反復子にのみ適用されることに注意してください。コンテナー内のアイテムの数は、次のように計算できます。

    int count = 0;
    for (iterator it = begin(); it != end(); ++it, ++count) { }
    

    そう、begin() countそう、 そう 、そして、 そうend()
    begin() + count = end()
    end() - begin() = countcount = size()
    end() - begin() = size()

  4. これは C++ の動作方法ではありません。この動作を実現する設計パターンはありますが、通常はクラスを変更するときに、無効化された場合に依存するクラスが更新されるようにするのはユーザーの責任です。スコープ外になったコンテナーのイテレーターを使用しようとすると、未定義の動作が発生します。

  5. end()おそらく次のようなことを念頭に置いて、最後の要素を過ぎています:(他の理由の中でも確かです)

    for (iterator it = begin(); it != end(); ++it)
    
于 2013-02-28T07:17:20.577 に答える