負の数を取る以上のことはありますか?
4 に答える
- その引数を変更します
- 何も返しません
- 入力イテレータ以上(または負の距離が指定されている場合は双方向イテレータ)で動作します
- 引数を変更せずに残します
- 指定された量だけ進められた引数のコピーを返します
- 順方向イテレータ以上(または負の距離が指定されている場合は双方向イテレータ)で動作します)
おそらく最大の実用的な違いは、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)
- 入力イテレータが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位置前方に移動した場合の位置を生成します。
- 双方向およびランダムアクセスのイテレータの場合、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;
イテレータが入力イテレータの場合、どちらも実際には負の値をサポートしていることに注意してください。またstd::next
、イテレータがForwardIteratorの条件を満たす必要がありますが、std::advance
必要なのは入力イテレータのみであることに注意してください(負の距離を使用しない場合)。