3

私は次の投稿に従いました。これは、いくつかの非 const 操作の後に反復子がどのように動作するかを示すシナリオを示しています。

イテレータの無効化規則

と の違いを理解するのに問題がreferenceありiteratorます。明確にするための例としてリストされているルールの 1 つを次に示します。

deque: 挿入されたメンバーが deque の末尾 (先頭または末尾) にない限り、すべての反復子と参照が無効になります (この場合、すべての反復子は無効になりますが、要素への参照は影響を受けません) [23.2.1.3/1]

参考にしたサンプルコードはこちら。

std::deque<int> mydeque;
mydeque.push_back(1);
mydeque.push_back(2);
mydeque.push_back(3);

const int& int3 = mydeque.back();                     // reference to 3
      int& int3 = mydeque.back();
std::deque<int>::iterator itBack = mydeque.crbegin(); // pointing to 3

mydeque.push_back(4);

質問> 私の漠然とした理解が正しければ、次のステートメントは正しいです。

After the calling of the line of `mydeque.push_back(4)`
`int3` is still valid because it is a reference to element.
`itBack` is invalidated because it is an iterator.

ありがとうございました

4

1 に答える 1

1

はい、それは正しいですね。イテレータが無効になるのに参照が無効にならない理由は、イテレータが正しく実行できる必要があるためですが、両端キューに何かをプッシュすると、それを追跡するために構造が再配置される可能性があります++--しかし、deque は、要素の周りにコンテナーを再構築する必要がある場合でも、要素自体を移動しないことを保証します。

これは、deque の実装のイテレータに追加レベルの間接化が組み込まれていることを示唆しています。しかし、それがイテレータの要点であり、参照とは異なる理由です。

于 2013-07-07T21:14:33.043 に答える