コメントが長すぎたので、回答として投稿しますが、完全ではない可能性があります。
++iter
イテレータを進めるなどの構成。したがって、ループ内にラインがあり、ループ++iter
の最後に別のラインがある場合は、ループごとに2回進めます。++iter
次の要素を指すイテレータを生成せず、むしろその要素に移動iter
します。
私が理解していることから、あなたは++iter != iter_is_pointing_to_this_vector.end()
次の要素が終わりであるかどうかをチェックするためにあなたがすることを理解しています。現在の要素がベクトルの最後の要素であるかどうかを判別します。しかし、あなたが書いたコードは何か違うことをします。
必要なことを実行するには、現在の要素から次の要素に設定する別のイテレーターが必要になります。
std::vector<std::string>::iterator = iter = v.begin();
std::vector<std::string>::iterator = iter2 = v.begin();
++iter2;
while( {...} ){
if(iter2 != v.end() ){...}
++iter2; ++iter;
}
もちろんv
、複数の要素があることを確認する必要があります。reverse_iterator
コンテナがそれを提供する場合にも使用できます。
typedef iter_t std::vector<std::string>::iterator;
iter_t = iter = v.begin();
std::reverse_iterator<iter_t> = iter2 = v.rbegin();
while( {...} ){
if(iter != iter2.base() ){...}
++iter;
}
注:base()
逆反復子を通常の(順方向)反復子に変換して、比較できるようにします。
編集:双方向イテレータで使用できるようです。つまりreverse_iterator
、デクリメント操作も実装されているはずです。したがって、実際には逆方向に反復する必要はないので、に対して1つの要素に対して反復子が必要なだけend
で、より簡単な方法は次のようになります。
typedef iter_t std::vector<std::string>::iterator;
iter_t = iter = v.begin();
iter_t = iter2 = v.end();
--iter2;
while( {...} ){
if(iter != iter2){...}
++iter;
}