std:: next
|
定義先ヘッダ
<iterator>
|
||
|
template
<
class
InputIt
>
InputIt next ( InputIt it, typename std:: iterator_traits < InputIt > :: difference_type n = 1 ) ; |
(C++11以降)
(C++17まで) |
|
|
template
<
class
InputIt
>
constexpr
|
(C++17以降) | |
n th 番目の後続イテレータ(または - n th 番目の前駆イテレータ( n が負の場合))を返します。
目次 |
パラメータ
| it | - | イテレータ |
| n | - | 進める要素数 |
| 型の要件 | ||
-
InputIt
は
LegacyInputIterator
の要件を満たさなければならない。
|
||
戻り値
InputIt
型のイテレータで、イテレータ
it
の
n
th
番目の後続(または
-
n
th
番目の先行要素(
n
が負の場合))を保持するイテレータ。
計算量
線形。
しかし、
InputIt
がさらに
LegacyRandomAccessIterator
の要件を満たす場合、計算量は定数時間となります。
実装例
template<class InputIt> constexpr // C++17以降 InputIt next(InputIt it, typename std::iterator_traits<InputIt>::difference_type n = 1) { std::advance(it, n); return it; } |
注記
式
++
c.
begin
(
)
はしばしばコンパイル可能ですが、保証されているわけではありません:
c.
begin
(
)
は右辺値式であり、右辺値のインクリメントが動作することが保証されていることを規定する
LegacyInputIterator
要件は存在しません。特に、イテレータがポインタとして実装されている場合や、
operator++
が左辺値参照修飾されている場合、
++
c.
begin
(
)
はコンパイルできませんが、
std
::
next
(
c.
begin
(
)
)
はコンパイルできます。
例
#include <iostream> #include <iterator> #include <vector> int main() { std::vector<int> v{4, 5, 6}; auto it = v.begin(); auto nx = std::next(it, 2); std::cout << *it << ' ' << *nx << '\n'; it = v.end(); nx = std::next(it, -2); std::cout << ' ' << *nx << '\n'; }
出力:
4 6 5
不具合報告
以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。
| DR | 適用対象 | 公開時の動作 | 正しい動作 |
|---|---|---|---|
| LWG 2353 | C++11 |
next
は
LegacyForwardIterator
を要求
|
LegacyInputIterator を許可 |
関連項目
|
(C++11)
|
イテレータをデクリメントする
(関数テンプレート) |
|
イテレータを指定された距離だけ進める
(関数テンプレート) |
|
|
2つのイテレータ間の距離を返す
(関数テンプレート) |
|
|
(C++20)
|
イテレータを指定された距離だけ、または境界までインクリメントする
(アルゴリズム関数オブジェクト) |