事前に負の数を取る以上のことはありますか?
おそらく最大の実用的な違いは、 std::next()
はC++ 11でのみ利用できることです。
std::next()
はデフォルトで1つずつ進みますが、 std::advance()
は距離を必要とします。
そして、戻り値があります:
std::advance()
:(なし)(渡された反復子は変更されます)std::next()
:n番目の後続。std::next()
は_std::advance
_と同様に負の数を取ります。その場合、反復子は双方向でなければなりません。 std::prev()
は、意図が具体的に後方に移動することである場合により読みやすくなります。
std :: advance
関数advance()は、引数として渡された反復子の位置を増やします。したがって、この関数により、反復子は複数の要素を前方(または後方)に移動できます。
#include <iterator>
void advance (InputIterator& pos, Dist n)
- 入力反復子posをn要素前方にステップさせます(または後方)。
- 双方向およびランダムアクセスイテレータの場合、nは後方に進むために負になる場合があります。
- Distはテンプレートタイプです。通常、整数型である必要があります。これは、<、++、-などの演算、および0との比較が呼び出されるためです。
- Advance()は、シーケンスのend()を超えるかどうかをチェックしないことに注意してください(イテレーターは一般に、それが動作するコンテナーを知らないため、チェックできません)。したがって、この関数を呼び出すと、シーケンスの最後に演算子++を呼び出すことが定義されていないため、未定義の動作が発生する可能性があります。
std :: next(およびstd::prev
C++ 11の新機能)
#include <iterator>
ForwardIterator next (ForwardIterator pos)
ForwardIterator next (ForwardIterator pos, Dist n)
- 1またはnポジションだけ前方に移動した場合に、前方イテレータposが持つ位置を返します。
- 双方向およびランダムアクセスイテレータの場合、nは負の値になり、以前のオプションが生成されます。
- Distはタイプstd :: iterator_traits :: difference_typeです。
- 内部一時オブジェクトのadvance(pos、n)を呼び出します。
- Next()は、シーケンスのend()を超えるかどうかをチェックしないことに注意してください。したがって、結果が有効であることを確認するのは呼び出し側の責任です。
The C++ Standard Library Second Edition
から引用
_std::next
_はコピーを返し、_std::advance
_は引数を変更することを除いて、ほとんど同じです。標準では_std::next
_のように動作するために_std::advance
_が必要であることに注意してください。
24.4.4イテレーター操作[iterator.operations]
_template <class InputIterator, class Distance> void advance(InputIterator& i [remark: reference], Distance n);
_2.次のものが必要です。nは、双方向およびランダムアクセスイテレータに対してのみ負になります。
3。効果:反復子参照iをnずつ増分(または負のnに対して減分)します。
[...]_template <class ForwardIterator> ForwardIterator next(ForwardIterator x, [remark: copy] typename std::iterator_traits<ForwardIterator>::difference_type n = 1);
_6.効果:
advance(x, n); return x;
と同等
bothは、反復子が入力反復子である場合、実際に負の値をサポートすることに注意してください。 _std::next
_にはForwardIteratorの条件を満たすためにイテレーターが必要ですが、_std::advance
_には入力イテレーターのみが必要です(負の距離を使用しない場合)。