std::ranges:: next
|
ヘッダーで定義
<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以降) |
イテレータ i の n 番目 の後続要素を返します。
このページで説明されている関数ライクな実体は、 アルゴリズム関数オブジェクト (非公式には niebloids として知られる)です。つまり:
- 明示的なテンプレート引数リストは、いずれかを呼び出す際に指定できません。
- いずれも 実引数依存の名前探索 では可視になりません。
- いずれかが関数呼び出し演算子の左側の名前として 通常の非修飾名前探索 によって発見された場合、 実引数依存の名前探索 は抑制されます。
目次 |
パラメータ
| i | - | イテレータ |
| n | - | 進める要素の数 |
| bound | - | 範囲の終端を示すセンチネル i が指す |
戻り値
計算量
I
と
S
が両方とも
std::
random_access_iterator
<
I
>
と
std::
sized_sentinel_for
<
S, I
>
を満たす場合、または
I
と
S
が
std::
assignable_from
<
I
&
, S
>
を満たす場合。それ以外は線形時間。
I
と
S
の両方が
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
(
)
は右辺値式であり、右辺値のインクリメントが保証されることを規定する要件は存在しません。特に、イテレータがポインタとして実装されている場合や、その
operator++
が左辺値参照修飾されている場合、
++
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++20)
|
指定された距離だけイテレータをデクリメントする、または境界までデクリメントする
(アルゴリズム関数オブジェクト) |
|
(C++20)
|
指定された距離だけイテレータを進める、または指定された境界まで進める
(アルゴリズム関数オブジェクト) |
|
(C++11)
|
イテレータをインクリメントする
(関数テンプレート) |