std::advance
来自 cppreference.com
定义在头文件 <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) |
将迭代器递增给定距离或到给定边界 (niebloid) |