C++11未提供foreach关键字,但引入基于范围的for循环;语法为for (auto& x : container),推荐const auto&避免拷贝,容器需支持begin()/end(),且不可在循环中增删元素。
C++11 没有 foreach 关键字,但提供了基于范围的 for 循环(range-based for),语法简洁、语义清晰,且在绝大多数场景下效率不输传统 for。
基本写法:用 for (auto& x : container) 遍历容器
这是最常用、最安全的写法。注意三点:
-
auto&表示引用,避免拷贝;若只读,推荐const auto& - 容器必须支持
begin()和end()(标准容器、C 风格数组、std::initializer_list都满足) - 不能在循环中增删元素(会令迭代器失效,行为未定义)
示例:
std::vector v = {1, 2, 3};
for (const auto& x : v) {
std::cout << x << " "; // 输出:1 2 3
}
什么时候该用 auto、auto& 还是 auto&&?
类型推导直接影响性能和正确性:
立即学习“C++免费学习笔记(深入)”;
-
auto x→ 值拷贝:对std::string、std::vector等重型对象开销明显 -
auto& x→ 左值引用:可读可写,适用于需修改原元素的场景 -
const auto& x→ 只读引用:零拷贝、最常用,尤其遍历只读容器时 -
auto&& x→ 万能引用:能绑定左值/右值,适合泛型代码或接收临时对象,但日常遍历中不必要
别写 for (auto x : v) 遍历 std::string —— 每次都触发深拷贝。