std::ranges:: prev
|
定义于头文件
<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 个前驱。
本页面描述的函数式实体是 算法函数对象 (非正式称为 niebloids ),即:
目录 |
参数
| i | - | 迭代器 |
| n | - | i 应递减的元素数量 |
| bound | - | 表示 i 所指向范围的起始迭代器 |
返回值
复杂度
可能的实现
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; } }; inline constexpr auto 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)
|
递减迭代器
(函数模板) |