2010-12-06 48 views
2

プログラム内のイテレータが以前の操作で無効になることがあるので、明示的に無効化したいと考えています。それを無効にするポインタにNULLを代入するなど、イテレータでも同じことをしたいだけです。 container.end()はここでは正確な考えではありませんでした。私は自分のイテレータにNULLを割り当てようとしましたが、失敗しました。イテレータでNULLポインタの同じ動作をどうやって得ることができますか?イテレータを無効にする方法は?

+0

まず、このような振る舞いにはお勧めできません。次に、イテレータへのポインタを格納できます。 – W55tKQbuRu28Q4xv

+1

あなたが本当に誰かに未定義の振る舞いを明白に与える方法を説明してもらいたいなら、 – kriss

+0

なぜこれを望みますか?後でイテレータで行うことができないことは、あなたが前に行うことはできません。 – MSalters

答えて

1

これは常に動作しませんか? (イテレーターは常に割り当て可能で、デフォルトコンストラクターブルです)

template <typename Iter> 
void foo(Iter it){ 
    it = Iter(); // invalidate 
} 
+0

これは非常にクールです。イテレータの型を直接取得できるので、関数は不要です。ちなみに、参考にして渡す必要があると思いますが、これは正しいのですか? – Thomson

+0

これを変更するには、確かに。これはほんの一例でした。私がそれを関数にした唯一の理由は、 "イテレータの型が' Iter'でイテレータのオブジェクトが 'it' ...と仮定するのが最も簡単な方法でした。 – jalf

2

なぜあなたはcontainer.end()を使用したいドント...それはほとんどのコンテナのために働く...

あなたは位置が yourstring.nposで天気をチェックすることをお勧めしますのstd :: stringに

?。

4

は、あなたはそれが有効ではない可能性がわかっている場合は、あなたがそれをしなければならないすべてはそれを使用して停止...私は明示的に

を、それを無効にしたい、いくつかの前の操作によって無効にすることができ 。イテレータを無効にすると、明示的に何も処理が行われません。

+2

追加のブロックを使用してイテレータの範囲を制限しようとします。ブロックの外側では、イテレータはもう存在しません。それは無効よりも優れています。 –

1

一般的にはできません。無効にすることはできないイテレータがいくつかあります。たとえば、乱数ジェネレータを出力イテレータとしてモデル化すると、operator*が現在の数値を返し、operator++が新しいものを生成します。

関連する問題