2009-06-23 7 views
34

イテレータを使用して通常の計算を行うことはできますか?つまり、数字を加算するだけですか?一例として、数字を追加するだけでイテレータをインクリメントできますか?

、私は要素vec[3]を削除したい場合は、私はこれを行うことができます。

std::vector<int> vec; 
for(int i = 0; i < 5; ++i){ 
     vec.push_back(i); 
} 
vec.erase(vec.begin() + 3); // removes vec[3] element 

それは私(G ++)のために動作しますが、それはを保証している場合、私はわからないんだけど働く

答えて

42

イテレータがランダムアクセスイテレータであれば動作します。イテレータはベクトルのイテレータです(reference参照)。 STL関数std::advanceは一般的なイテレータを進めるのに使うことができますが、イテレータを返さないので、私はクリーナーのように見えますので使用可能な場合は使用します。

C++ 11ノート

今すぐstd::nextstd::prevはイテレータを返す行うれ、そこにあるので、あなたは、テンプレートの土地で作業している場合は、汎用のイテレータを進めるためにそれらを使用し、まだ持っていることができますクリーンなコード。

+7

ああ、std :: listではうまくいきませんか? – Frank

+2

修正;どの関数がどのタイプのイテレータに利用可能であるべきかを列挙したドキュメントリンクを追加しました。 –

+1

いいえ、そうではありません。 +演算子は、リストイテレータが実行できない "一歩前にこれを先にジャンプ"することを意味します。リスト反復子のような順方向非ランダムアクセスイテレータは、インクリメント(++)演算子をサポートしているため、一度に1つの要素だけ進めることができません。 Toddが述べたように、+演算子を繰り返し呼び出すstd :: advanceを使用すると、非ランダムなイテレータをいくつかのステップで前方に移動するというアイデアを簡潔に表現できます。 –

2

ランダムアクセスイテレータで動作します。一般的には、より一般的なstd::advanceを見るとよいでしょう。この関数テンプレートを使用することによるパフォーマンスの影響を理解してください。

関連する問題