27

私が間違っている場合は訂正してください。ありがとうございました!

insert要素をerase再配置しますが、挿入/消去が行われる位置の前の要素は再配置されないため、それらのイテレータは有効なままです。

push_backpop_backイテレータを無効にしないでください。

push_frontpop_frontすべてのイテレータを無効にします。

swap要素を再配置しませんが、どういうわけか、イテレータを無効にする必要があると思います。

4

1 に答える 1

30

push_back()およびpush_front()は、で定義されinsert()ます。同様に、pop_back()pop_front()は。で定義されerase()ます。

insert()(23.2.1.3/1)のイテレータ無効化についてC++03標準が述べていることは次のとおりです。

dequeの途中に挿入すると、すべてのイテレータとdequeの要素への参照が無効になります。dequeのいずれかの端に挿入すると、dequeへのすべてのイテレータが無効になりますが、dequeの要素への参照の有効性には影響しません。

したがってpush_front()、イテレータpush_back() 無効になりますが、要素自体への参照は引き続き有効です。

erase()どちらの端でも(23.2.1.3 / 4):

dequeの途中で消去すると、すべてのイテレータとdequeの要素への参照が無効になります。dequeのいずれかの端で消去すると、イテレータと消去された要素への参照のみが無効になります。

したがってpop_front()pop_back()問題の最後にある要素へのイテレータ/参照のみを無効にします。

そして、これはswap()、標準的なコンテナ(23.1 / 10「コンテナ要件」)についてこれを示していると言われています。

swap()関数は、スワップされるコンテナーの要素を参照する参照、ポインター、またはイテレーターを無効にしません。

end()C ++ 11は、これらの操作でのイテレータのdeque動作に関する次の説明を追加します。基本的に、イテレータは、 :の最後の要素を消去したend()後、または消去した後、無効として扱われる必要があります。swap()deque

dequeの最後の要素を消去する消去操作は、過去のイテレータとすべてのイテレータ、および消去された要素への参照のみを無効にします。

スワップの前に一方のコンテナの要素を参照するすべてのイテレータは、スワップの後にもう一方のコンテナの同じ要素を参照する必要があります。スワップ前の値がa.end()のイテレータが、スワップ後に値b.end()を持つかどうかは指定されていません。

C ++ 11コンパイラをまだ使用していない場合でも、これらのルールが適用されるかのようにコーディングすることをお勧めします。

于 2012-04-29T17:09:31.200 に答える