名前空間
変種
操作

std::next

From cppreference.com
 
 
イテレータライブラリ
イテレータのコンセプト
イテレータのプリミティブ
アルゴリズムのコンセプトとユーティリティ
間接呼び出し可能コンセプト
共通アルゴリズム要件
(C++20)
(C++20)
(C++20)
ユーティリティ
(C++20)
イテレータアダプタ
Rangeアクセス
(C++11)(C++14)
(C++14)(C++14)  
(C++11)(C++14)
(C++14)(C++14)  
(C++17)(C++20)
(C++17)
(C++17)
 
ヘッダ <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

InputIt next( InputIt it, typename std::iterator_traits<InputIt>::difference_type n = 1 );
(C++17以降)

イテレータ itn 番目の後続要素(n が負の場合は -n 番目の先行要素)を返す。

目次

[編集] パラメータ

it - イテレータ
n - 進める要素数
型要件
-
InputItLegacyInputIterator の要件を満たす必要があります。

[編集] 戻り値

イテレータ itn 番目の後続要素(n が負の場合は -n 番目の先行要素)を保持する InputIt 型のイテレータ。

[編集] 計算量

線形。

ただし、InputIt がさらに LegacyRandomAccessIterator の要件を満たす場合、計算量は定数時間。

[編集] 実装例

template<class InputIt>
constexpr // since 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++ がlvalue-ref-qualifiedである場合、++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 nextLegacyForwardIterator を必要とした LegacyInputIterator が許可された

[編集] 関連項目

(C++11)
イテレータをデクリメントする
(関数テンプレート) [編集]
イテレータを指定された距離だけ進める
(関数テンプレート) [編集]
2つのイテレータ間の距離を返す
(関数テンプレート) [編集]
イテレータを指定された距離または境界までインクリメントする
(アルゴリズム関数オブジェクト)[編集]
English 日本語 中文(简体) 中文(繁體)