std::next
來自 cppreference.com
< cpp | 迭代器 (iterator)
定義於標頭檔案 <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 的要求。 |
[編輯] 返回值
一個 InputIt
型別的迭代器,它表示迭代器 it 的第 n 個後繼(或當 n 為負數時的第 -n 個前驅)。
[編輯] 複雜度
線性。
然而,若 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++
被左值引用限定時,++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++ 標準。
缺陷報告 | 應用於 | 釋出時的行為 | 正確的行為 |
---|---|---|---|
LWG 2353 | C++11 | next 要求 LegacyForwardIterator |
允許 LegacyInputIterator |
[編輯] 參閱
(C++11) |
遞減迭代器 (函式模板) |
按給定距離前進迭代器 (函式模板) | |
返回兩個迭代器間的距離 (函式模板) | |
(C++20) |
按給定距離或到邊界遞增迭代器 (演算法函式物件) |