2011-12-30 6 views
0

私は頻繁に中点から要素を削除します。両端キュー内の要素のメモリアドレスは他の場所で使用されます。 dequeから中間要素を消去するのはベクトルと同様にdequeへのすべてのポインタを無効にしますか?中央からのデキー消去は、ポインタが失われていますか?

dequeの実装を読み込もうとしましたが、複雑ですが、リストまたはベクターとして機能するかどうかはわかりません。

私はdequeのvisualC++ std実装を使用しています。

答えて

3

はい。中間に挿入すると、すべてのイテレータと要素への参照(したがって要素へのポインタ)が無効になります。どちらかの端に挿入すると、イテレータはすべて無効になりますが、参照やポインタは無効になります。そして、あなたはそのようなことを見つけるために実装を読んでいません。あなたはその文書を読む。 (実装は実際に正式にサポートされていない操作を可能にするかもしれませんが、次のバグ修正まで)

+0

std :: listに切り替えます。途中から消去すると問題がありますか?私はちょうど確かにしたい、それは切り替えるためにしばらく時間がかかるだろう。私は多くの[]と.at()呼び出しを持っています。 – mikbal

+0

@mikbal:リストはより安全でイテレータの無効化を防ぎますが、標準ライブラリコンテナを選択することは、保存するデータのタイプとデータに対して実行する操作に大きく依存します。 –

+0

すべての要素を繰り返します。それはリストのようなものではありませんが、実際にはdequeとvectorに比べて何とか非常に遅いので、私はすべてのためにo(n)です。それは私の運命を列挙しているようだ。 – mikbal

2

dequeから中間要素を消去すると、ベクトルと同じようにdequeのすべてのポインタが無効になりますか?

両端キューの場合、削除されたメンバーが両端キューの前端または後端にある場合を除き、すべてのイテレータおよび両端キューへの参照が無効になります。

ベクトルの場合、新しいコンテナのサイズが以前の容量より大きい場合を除いて、挿入ポイント前のすべてのイテレータと参照は影響を受けません。

関連する問題