for循环配合下标访问vector最快最清晰,需注意size_t越界问题;推荐用i<size()而非i!=size();空容器或扩容时end()与size()含义不同易引发错误。

用for循环遍历vector最直接
绝大多数场景下,for 循环配合下标访问是最快、最清晰的方式,编译器也容易优化。注意别越界——vector::size() 返回 size_t(无符号),和负数比较会出问题。
- 推荐写法:
for (size_t i = 0; i ,避免隐式类型转换 - 如果需要修改元素,用
vec[i] = ...;只读时可考虑 const 引用避免拷贝:const auto& item = vec[i] - 别写
i :当 <code>vec为空时,vec.size() - 1会绕回成极大正数,导致无限循环
范围for(C++11起)更简洁安全
只要不需要索引位置,for (const auto& x : vec) 是首选。它自动处理迭代器边界,不会越界,语义明确,且能完美支持移动语义。
- 只读访问优先用
const auto&,避免不必要的拷贝(尤其对 string、自定义类) - 要修改原容器元素,去掉
const,写成auto& x;若需值语义修改(不影响原 vector),才用auto x - 不适用于需要跳过元素、反向遍历或中途计算索引的场景
用迭代器遍历时注意失效风险
begin()/end() 迭代器在 vector 插入/删除时极易失效,尤其是 push_back() 可能触发扩容,让所有现存迭代器变悬空指针。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
- 安全写法:只读遍历可用
for (auto it = vec.begin(); it != vec.end(); ++it),但不如范围for直观 - 千万别在循环体内调用
vec.erase(it)后还++it——erase()返回下一个有效迭代器,应写成it = vec.erase(it) - 想边遍历边删多个元素?先收集待删索引,再倒序删除;或用
std::remove_if+erase惯用法
反向遍历别用 size()-1 当起点
因为 size() 是 size_t,vec.size() - 1 在空 vector 下是极大值,会导致死循环或崩溃。
立即学习“C++免费学习笔记(深入)”;
- 正确做法:用反向迭代器
for (auto it = vec.rbegin(); it != vec.rend(); ++it) - 或者用有符号整型控制:
for (int i = static_cast<int>(vec.size()) - 1; i >= 0; --i)</int> - 不要依赖
vec.size() > 0就直接减一——条件判断和减法不是原子操作,多线程下仍有风险
实际项目里最容易被忽略的是:混合使用迭代器和下标时,没意识到 end() 指向的是末尾后一位,而 size() 是元素个数。这两个看似等价的概念,在空容器、扩容、调试断点跳转时会暴露差异。

















