std::ranges::next
From cppreference.com
| ヘッダ <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 番目の後続要素を返します。
このページで説明されている関数のようなエンティティは、アルゴリズム関数オブジェクト(非公式にはニーブロイドとして知られている)です。つまり、
- これらのいずれかを呼び出す際に、明示的なテンプレート引数リストを指定することはできません。
- これらのいずれも実引数依存の名前探索には見えません。
- これらのいずれかが関数呼び出し演算子の左側の名前として通常の非修飾名探索によって見つかった場合、実引数依存の名前探索は抑制されます。
目次 |
[編集] パラメータ
| i | - | イテレータ |
| n | - | 進める要素数 |
| bound | - | イテレータ i が指す範囲の終端を示すセ |
[編集] 戻り値
1) イテレータ i の後続要素。
2) イテレータ i の n 番目の後続要素。
3) bound に等しい最初のイテレータ。
4) イテレータ i の n 番目の後続要素、または bound に等しい最初のイテレータのいずれか早い方。
[編集] 計算量
1) 定数時間。
3)
I と S が両方とも std::random_access_iterator<I> と std::sized_sentinel_for<S, I> をモデルとする場合、または I と S が std::assignable_from<I&, S> をモデルとする場合は定数時間、それ以外の場合は線形時間。4)
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() は 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++20) |
イテレータを指定された距離または境界までデクリメントする (アルゴリズム関数オブジェクト) |
| (C++20) |
イテレータを指定された距離または指定された境界まで進める (アルゴリズム関数オブジェクト) |
| (C++11) |
イテレータをインクリメントする (関数テンプレート) |