std::advance
来自 cppreference.cn
< cpp | 迭代器 (iterator)
定义于头文件 <iterator> |
||
template< class InputIt, class Distance > void advance( InputIt& it, Distance n ); |
(C++17 前) | |
template< class InputIt, class Distance > constexpr void advance( InputIt& it, Distance n ); |
(C++17 起) | |
将给定迭代器 it 增加 n 个元素。
若 n 为负,则迭代器递减。在此情况下,InputIt
必须满足 LegacyBidirectionalIterator 的要求,否则行为未定义。
目录 |
[编辑] 参数
it | - | 要前进的迭代器 |
n | - | it 应前进的元素数量 |
类型要求 | ||
-InputIt 必须满足 LegacyInputIterator 的要求。 |
[编辑] 返回值
(无)
[编辑] 复杂度
线性。
然而,如果 InputIt
另外满足 LegacyRandomAccessIterator 的要求,则复杂度是常数。
[编辑] 注意
如果指定的递增或递减序列要求递增不可递增的迭代器(例如尾后迭代器),或者递减不可递减的迭代器(例如首迭代器或奇异迭代器),则行为未定义。
[编辑] 可能的实现
非 constexpr 版本 |
---|
namespace detail { template<class It> void do_advance(It& it, typename std::iterator_traits<It>::difference_type n, std::input_iterator_tag) { while (n > 0) { --n; ++it; } } template<class It> void do_advance(It& it, typename std::iterator_traits<It>::difference_type n, std::bidirectional_iterator_tag) { while (n > 0) { --n; ++it; } while (n < 0) { ++n; --it; } } template<class It> void do_advance(It& it, typename std::iterator_traits<It>::difference_type n, std::random_access_iterator_tag) { it += n; } } // namespace detail template<class It, class Distance> void advance(It& it, Distance n) { detail::do_advance(it, typename std::iterator_traits<It>::difference_type(n), typename std::iterator_traits<It>::iterator_category()); } |
constexpr 版本 |
template<class It, class Distance> constexpr void advance(It& it, Distance n) { using category = typename std::iterator_traits<It>::iterator_category; static_assert(std::is_base_of_v<std::input_iterator_tag, category>); auto dist = typename std::iterator_traits<It>::difference_type(n); if constexpr (std::is_base_of_v<std::random_access_iterator_tag, category>) it += dist; else { while (dist > 0) { --dist; ++it; } if constexpr (std::is_base_of_v<std::bidirectional_iterator_tag, category>) while (dist < 0) { ++dist; --it; } } } |
[编辑] 示例
运行此代码
#include <iostream> #include <iterator> #include <vector> int main() { std::vector<int> v{3, 1, 4}; auto vi = v.begin(); std::advance(vi, 2); std::cout << *vi << ' '; vi = v.end(); std::advance(vi, -2); std::cout << *vi << '\n'; }
输出
4 1
[编辑] 参阅
(C++11) |
递增迭代器 (函数模板) |
(C++11) |
递减迭代器 (函数模板) |
返回两个迭代器间的距离 (函数模板) | |
(C++20) |
将迭代器前进指定距离或到指定边界 (算法函数对象) |