std::ranges::prev
来自cppreference.com
在标头 <iterator> 定义 | ||
调用签名 | ||
template<std::bidirectional_iterator I > constexpr I prev( I i ); | (1) | (C++20 起) |
template<std::bidirectional_iterator I > constexpr I prev( I i, std::iter_difference_t<I> n ); | (2) | (C++20 起) |
template<std::bidirectional_iterator I > constexpr I prev( I i, std::iter_difference_t<I> n, I bound ); | (3) | (C++20 起) |
返回迭代器 i 的第 n 个前驱。
此页面上描述的函数式实体是算法函数对象(非正式地称为 niebloid),即:
目录 |
[编辑]参数
i | - | 迭代器 |
n | - | 要减少 i 的次数 |
bound | - | 迭代器,代表 i 所指向的范围的起始 |
[编辑]返回值
1)i 的前驱。
2) 迭代器 i 的第 n 个前驱
3) 迭代器 i 的第 n 个前驱,或首个比较等于 bound 的迭代器,取决于何者先达成。
[编辑]复杂度
1) 常数。
[编辑]可能的实现
struct prev_fn {template<std::bidirectional_iterator I>constexpr I operator()(I i)const{--i;return i;} template<std::bidirectional_iterator I>constexpr I operator()(I i, std::iter_difference_t<I> n)const{ranges::advance(i, -n);return i;} template<std::bidirectional_iterator I>constexpr I operator()(I i, std::iter_difference_t<I> n, I bound)const{ranges::advance(i, -n, bound);return i;}}; inlineconstexprauto prev = prev_fn(); |
[编辑]注解
尽管对于容器,表达式 --r.end() 经常能编译,但不保证如此:r.end() 是右值表达式,而没有“指定右值的自减保证可用”的迭代器要求。尤其是迭代器实现为指针或其 operator--
带有左值引用限定时,--r.end() 不能编译,而 ranges::prev(r.end()) 能。
不实现 ranges::common_range 的范围加剧了这一情况。例如对于某些底层类型,ranges::transform_view::end 与 ranges::transform_view::begin 拥有不同的返回类型,故 --r.end() 将不能编译。此非 ranges::prev
所能帮助,但有一些变通方法。
[编辑]示例
运行此代码
#include <iostream>#include <iterator>#include <vector> int main(){std::vector<int> v{3, 1, 4};auto pv = std::ranges::prev(v.end(), 2);std::cout<<*pv <<'\n'; pv = std::ranges::prev(pv, 42, v.begin());std::cout<<*pv <<'\n';}
输出:
1 3
[编辑]参阅
(C++20) | 自增迭代器给定的距离或到边界 (算法函数对象) |
(C++20) | 令迭代器前进给定的距离或到给定的边界 (算法函数对象) |
(C++11) | 令迭代器自减 (函数模板) |