名前空間
変種
操作

std::ranges::next

From cppreference.com
 
 
イテレータライブラリ
イテレータのコンセプト
イテレータのプリミティブ
アルゴリズムのコンセプトとユーティリティ
間接呼び出し可能コンセプト
共通アルゴリズム要件
(C++20)
(C++20)
(C++20)
ユーティリティ
(C++20)
イテレータアダプタ
イテレータ操作
(C++11)  
(C++11)
ranges::next
(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< std::input_or_output_iterator I >
constexpr I next( I i );
(1) (C++20以降)
template< std::input_or_output_iterator I >
constexpr I next( I i, std::iter_difference_t<I> n );
(2) (C++20以降)
template< std::input_or_output_iterator I, std::sentinel_for<I> S >
constexpr I next( I i, S bound );
(3) (C++20以降)
template< std::input_or_output_iterator I, std::sentinel_for<I> S >
constexpr I next( I i, std::iter_difference_t<I> n, S bound );
(4) (C++20以降)

イテレータ in 番目の後続要素を返します。

このページで説明されている関数のようなエンティティは、アルゴリズム関数オブジェクト(非公式にはニーブロイドとして知られている)です。つまり、

目次

[編集] パラメータ

i - イテレータ
n - 進める要素数
bound - イテレータ i が指す範囲の終端を示すセンチネル

[編集] 戻り値

1) イテレータ i の後続要素。
2) イテレータ in 番目の後続要素。
3) bound に等しい最初のイテレータ。
4) イテレータ in 番目の後続要素、または bound に等しい最初のイテレータのいずれか早い方。

[編集] 計算量

1) 定数時間。
2) Istd::random_access_iterator をモデルとする場合は定数時間、それ以外の場合は線形時間。
3) IS が両方とも std::random_access_iterator<I>std::sized_sentinel_for<S, I> をモデルとする場合、または ISstd::assignable_from<I&, S> をモデルとする場合は定数時間、それ以外の場合は線形時間。
4) IS が両方とも std::random_access_iterator<I>std::sized_sentinel_for<S, I> をモデルとする場合は定数時間、それ以外の場合は線形時間。

[編集] 考えられる実装

struct next_fn
{
    template<std::input_or_output_iterator I>
    constexpr I operator()(I i) const
    {
        ++i;
        return i;
    }
 
    template<std::input_or_output_iterator I>
    constexpr I operator()(I i, std::iter_difference_t<I> n) const
    {
        ranges::advance(i, n);
        return i;
    }
 
    template<std::input_or_output_iterator I, std::sentinel_for<I> S>
    constexpr I operator()(I i, S bound) const
    {
        ranges::advance(i, bound);
        return i;
    }
 
    template<std::input_or_output_iterator I, std::sentinel_for<I> S>
    constexpr I operator()(I i, std::iter_difference_t<I> n, S bound) const
    {
        ranges::advance(i, n, bound);
        return i;
    }
};
 
inline constexpr auto next = next_fn();

[編集] 注釈

++x.begin() は多くの場合コンパイルできますが、必ずしもそうとは限りません。 x.begin() は rvalue 式であり、rvalue のインクリメントが確実に機能するという要件はありません。特に、イテレータがポインタとして実装されている場合や、その operator++ が lvalue-ref 修飾されている場合、 ++x.begin() はコンパイルされませんが、 ranges::next(x.begin()) はコンパイルされます。

[編集]

#include <cassert>
#include <iterator>
 
int main() 
{
    auto v = {3, 1, 4};
    {
        auto n = std::ranges::next(v.begin());
        assert(*n == 1);
    }
    {
        auto n = std::ranges::next(v.begin(), 2);
        assert(*n == 4);
    }
    {
        auto n = std::ranges::next(v.begin(), v.end());
        assert(n == v.end());
    }
    {
        auto n = std::ranges::next(v.begin(), 42, v.end());
        assert(n == v.end());
    }
}

[編集] 関連項目

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