web-dev-qa-db-ja.com

std :: advanceとstd :: nextの違いは何ですか?

事前に負の数を取る以上のことはありますか?

56
Tavison

std::advance

  • 引数を変更します
  • 何も返さない
  • 入力イテレータ以上で動作します(負の距離が指定されている場合は双方向イテレータ)

std::next

  • 引数を変更しないままにする
  • 指定された量だけ進んだ引数のコピーを返します
  • 前方反復子以上で動作します(負の距離が指定されている場合は双方向反復子)
87

おそらく最大の実用的な違いは、 std::next() はC++ 11でのみ利用できることです。

std::next() はデフォルトで1つずつ進みますが、 std::advance() は距離を必要とします。

そして、戻り値があります:

std::next() は_std::advance_と同様に負の数を取ります。その場合、反復子は双方向でなければなりません。 std::prev() は、意図が具体的に後方に移動することである場合により読みやすくなります。

15
Johnsyweb

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から引用

6
billz

_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_には入力イテレーターのみが必要です(負の距離を使用しない場合)。

3
Zeta