私は物事をやって、私はベクトルを通じて行進てる状況があります。イテレータを使用してstd :: vectorを歩き回り、気づかない最もクリーンな方法は何ですか?
std::vector::iterator iter = my_list.begin(); for (; iter != my_list.end(); ++iter) { if (iter->doStuff()) // returns true if successful, false o/w { // Keep going... } else { for (; iter != m_list.begin(); --iter) // ...This won't work... { iter->undoStuff(); } } }
通常の条件下では - すべてがうまくいくと仮定すると - 私はmy_list.end()
にすべての道を行進し、正常にループを終了します。
しかし、私が何かをやっている間に何かがうまくいかない場合、私はすべてを元に戻すことができるようにしたい - 基本的に私のステップをベクトルの最初に戻し、すべてを一度に逆順に取り消します。
私はmy_list.begin()
(ネストされたforループに示されているように)になると、リストの最初の要素にまだundoStuff()
を呼び出す必要があるため、実際にはまだ完了していません。さて、私はループの外で最後の呼び出しを行うことができますが、これは少し汚れているようです。
私はそれを見る方法は、私がmy_list.rend()
になるときにのみ行われます。しかし、私はstd :: vector :: iteratorをstd :: vector :: reverse_iteratorと比較することはできません。
私がやろうとしていることを考えれば、イテレーター型/ループの組み合わせの最良の選択は何ですか?
イテレータを考える簡単な方法は、要素間の位置にあるカーソルです。前方参照イテレータは参照解除されたときにカーソルの後に要素を生成し、逆参照器は逆参照されるときにカーソルの前に要素を生成します。等価順方向反復子と逆方向反復子は、同じ位置にあるカーソルです。 RAIIの使用のために – Mankarse