应优先使用 rbegin() 和 rend() 倒序遍历 vector,因其安全、通用、语义清晰;rbegin() 指向末元素,rend() 指向首元素前位置,循环条件为 it != rend();std::reverse 会真实翻转容器,仅在需修改原序时使用。

用 rbegin() 和 rend() 倒序遍历 vector 最直接
只要容器支持双向迭代器(vector 完全满足),就能用反向迭代器安全倒序访问。注意 rbegin() 指向最后一个元素,rend() 指向第一个元素的前一个位置(即逻辑上的“开头前”),所以循环条件是 it != rend(),不是 it != rbegin()。
常见错误是把 rend() 当成“指向首元素”,结果少遍历或越界:
for (auto it = vec.rbegin(); it != vec.rend(); ++it) {
std::cout << *it << " ";
}
这个写法安全、标准、零额外开销——反向迭代器底层只是对普通指针/迭代器做封装,++ 实际执行的是 -- 操作。
vector::reverse_iterator 类型要显式声明还是用 auto?
推荐无脑用 auto,避免手写冗长类型名;但若需函数参数或成员变量,则必须写出完整类型:
立即学习“C++免费学习笔记(深入)”;
-
auto it = vec.rbegin():最常用,类型自动推导为std::vector::reverse_iterator -
std::vector:当需要明确类型约束时才写,比如模板函数中限定参数类型::reverse_iterator it = vec.rbegin() - 别用
const_reverse_iterator除非你只读且vec是 const ——否则编译失败
和下标倒序(i = size()-1; i >= 0; i--)比有啥区别?
下标方式看似直观,但存在两个隐藏风险:
- 当
size()返回size_t(无符号)时,i >= 0永远为真,i--到 0 后继续变成极大正数,导致无限循环或越界访问 - 迭代器方式天然适配所有 STL 容器(
list、deque),而下标只对随机访问容器有效 - 反向迭代器可直接用于算法,比如
std::copy(vec.rbegin(), vec.rend(), out),下标做不到
所以哪怕只是 vector,也优先用 rbegin()/rend()——它更安全、更通用、语义更清晰。
用 std::reverse 是不是更简单?
std::reverse(vec.begin(), vec.end()) 会真正修改原容器顺序,这不是“遍历”,而是“翻转”。如果你只需要读取倒序数据,千万别用它——代价是 O(n) 时间 + 可能触发内存重排(对大 vector 影响明显)。
只有当你确实需要让 vector 内容物理反转时才调用它。绝大多数场景下,倒序遍历 ≠ 倒序存储。
反向迭代器不改数据、不分配内存、不触发拷贝,纯逻辑视图切换——这才是它存在的根本意义。










