2009-04-17 14 views
11

私はC++で要素の順序が乱れる可能性のあるもののリストを実装する予定です。私はランダムなアクセス(私はちょうど定期的にリストを掃除する必要がある)の種類を必要とすることを期待していない、と項目の順序も重要ではありません。C++イテレータの有効期間はどのくらいですか?

だから私はstd::list<Thing*> with this->position = insert(lst.end(), thing)と思っていました。私は後で簡単に行うことができるように、各インスタンスの位置を覚えているThingクラスをお願いします。lst.erase(this->position)一定時間で。

しかし、私はまだC++ STLコンテナに少し新しく、イテレータをこのように長い間保つのが安全かどうかはわかりません。特に、削除される前に挿入されたものの前と後に削除される他の要素があることを考えれば、

答えて

13

リストでは、すべてのイテレーターは挿入時に有効なままであり、イレーターからイレーズされたエレメントだけが消去中に無効になります。

挿入されたThing *の前後に他の要素が削除されても、イテレータは正常に保持されます。

EDIT

ベクトルとdequeのため

その他の詳細:

ベクトル

  • 挿入---再配分が発生した場合、すべてのイテレータは が無効取得、 そうでない場合はその有効。
  • erasing ----すべてのイテレータは、 イレースポイントの後に無効になります。

両端キュー

  • 挿入---全てのイテレータは無効 を取得します。
  • erasing ----すべてのイテレータは を無効にします。
+0

良い答えは、どのような理由でベクトルが再割り当てされるかを知るのに役立ちます。 – Malabarba

+0

ベクトルの変更(挿入と削除の両方)はイテレータの再割り当てと無効化を許可されています。そうするかどうかは実装定義です。したがって、どのような方法でもベクトルを変更すると、既存のすべてのイテレータが常に無効になると仮定すれば、最良の結果が得られます。 – Miral

3

これは、使用するコンテナによって異なります。

チェック:http://www.sgi.com/tech/stl/
各コンテナのドキュメントを最後に見て、イテレータが有効な条件について説明します。

std :: list <の場合、実際に参照する要素がコンテナから削除されるまで、すべての条件で有効です(この時点では無効です)。

+0

情報ありがとうございます。私はすでにSGIのドキュメンテーションを使っていましたが、私はノートを見落としたと思います。 – PypeBros

関連する問題