std::next
From cppreference.com
| ヘッダ <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以降) | |
イテレータ it の n 番目の後続要素(n が負の場合は -n 番目の先行要素)を返す。
目次 |
[編集] パラメータ
| it | - | イテレータ |
| n | - | 進める要素数 |
| 型要件 | ||
-InputIt は LegacyInputIterator の要件を満たす必要があります。 | ||
[編集] 戻り値
イテレータ it の n 番目の後続要素(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 | next は LegacyForwardIterator を必要とした |
LegacyInputIterator が許可された |
[編集] 関連項目
| (C++11) |
イテレータをデクリメントする (関数テンプレート) |
| イテレータを指定された距離だけ進める (関数テンプレート) | |
| 2つのイテレータ間の距離を返す (関数テンプレート) | |
| (C++20) |
イテレータを指定された距離または境界までインクリメントする (アルゴリズム関数オブジェクト) |