72

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

4

4 に答える 4

109

std::advance

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

std::next

  • 引数を変更せずに残します
  • 指定された量だけ進められた引数のコピーを返します
  • 順方向イテレータ以上(または負の距離が指定されている場合は双方向イテレータ)で動作します)
于 2013-02-22T04:54:32.050 に答える
20

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

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

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

std::next()と同じように負の数を取りますstd::advance。その場合、イテレータは双方向である必要があります。std::prev()意図が特に後方に移動することである場合、より読みやすくなります。

于 2013-02-22T04:54:01.363 に答える
7

std :: Advance

関数advance()は、引数として渡されたイテレータの位置をインクリメントします。したがって、この関数を使用すると、イテレータは複数の要素を前方(または後方)にステップできます。

#include <iterator>
void advance (InputIterator& pos, Dist n)
  • 入力イテレータがn個の要素を前方(または後方)にステップできるようにします。
  • 双方向およびランダムアクセスのイテレータの場合、nは負の値で後退する可能性があります。
  • Distはテンプレートタイプです。<、++、-、0との比較などの演算が呼び出されるため、通常は整数型である必要があります。
  • Advance()は、シーケンスのend()と交差するかどうかをチェックしないことに注意してください(イテレーターは一般に、操作するコンテナーを知らないため、チェックできません)。したがって、この関数を呼び出すと、シーケンスの最後に演算子++を呼び出すことが定義されていないため、未定義の動作が発生する可能性があります。

std :: next(およびstd::prevC ++ 11の新機能)

#include <iterator>
ForwardIterator next (ForwardIterator pos)
ForwardIterator next (ForwardIterator pos, Dist n)
  • 前方イテレータ位置が1またはn位置前方に移動した場合の位置を生成します。
  • 双方向およびランダムアクセスのイテレータの場合、nは負の値であり、前の位置を生成します。
  • Distはタイプstd::iterator_traits::difference_typeです。
  • 内部一時オブジェクトに対してadvance(pos、n)を呼び出します。
  • next()は、シーケンスのend()と交差するかどうかをチェックしないことに注意してください。したがって、結果が有効であることを確認するのは呼び出し元の責任です。

から引用The C++ Standard Library Second Edition

于 2013-02-22T05:03:13.113 に答える
4

それらはほとんど同じです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;

イテレータが入力イテレータの場合、どちらも実際には負の値をサポートしていることに注意してください。またstd::next、イテレータがForwardIteratorの条件を満たす必要がありますが、std::advance必要なのは入力イテレータのみであることに注意してください(負の距離を使用しない場合)。

于 2013-02-22T05:02:38.307 に答える