std::prev 是 C++ 标准库中的一个函数模板,位于 <iterator> 头文件中。它用于获取一个迭代器的前一个位置,适用于双向迭代器和随机访问迭代器。以下是详细介绍:
函数原型
// 返回迭代器 it 的第 n 个前驱
template< class BidirIt >
BidirIt std::prev( BidirIt it, typename std::iterator_traits<BidirIt>::difference_type n = 1 );
参数说明
it:输入的双向迭代器。n:要向前移动的步数,默认值为 1。
返回值
返回一个新的迭代器,指向 it 之前的第 n 个位置。
适用场景
- 双向迭代器:对于只能向前和向后移动一步的迭代器(如
std::list::iterator),std::prev比手动多次调用--it更方便。 - 随机访问迭代器:对于支持直接跳跃的迭代器(如
std::vector::iterator),std::prev会优化为一步计算,避免循环。 - 安全获取前驱:当需要获取容器末尾的前一个元素时(如
std::prev(v.end())),使用std::prev比手动计算更安全,可避免越界。
示例代码
#include <iostream>
#include <vector>
#include <list>
#include <iterator>
int main() {
// 使用 vector(随机访问迭代器)
std::vector<int> vec = {10, 20, 30, 40, 50};
auto it = vec.end();
auto prev_it = std::prev(it, 2); // 获取倒数第二个元素
std::cout << *prev_it << std::endl; // 输出: 40
// 使用 list(双向迭代器)
std::list<char> lst = {'a', 'b', 'c', 'd'};
auto lst_it = lst.begin();
std::advance(lst_it, 3); // 移动到 'd'
auto lst_prev = std::prev(lst_it); // 前一个元素
std::cout << *lst_prev << std::endl; // 输出: 'c'
return 0;
}
注意事项
- 迭代器类型要求:
it必须至少是双向迭代器。如果使用单向迭代器(如std::forward_list::iterator),会导致编译错误。 - 越界风险:如果
n大于it到容器起始位置的距离,行为未定义(可能崩溃)。 - 性能差异:对于随机访问迭代器,
std::prev是 O(1) 操作;对于双向迭代器,是 O(n) 操作。
常见应用
- 获取容器的倒数第
n个元素:std::prev(container.end(), n)。 - 在循环中安全访问前一个元素:
auto prev = std::prev(current_it)。 - 与
std::next配合,在迭代器范围内移动:std::prev(std::next(it, 5), 3)等价于std::next(it, 2)。
6

被折叠的 条评论
为什么被折叠?



