C++11 基于范围的循环

本文详细介绍了C++11中新增的基于范围的for循环语法,通过实例展示了如何在容器、C-style数组及初始化列表中使用。同时,文章还探讨了相关算法如for_each和for_each_n的应用,提供了丰富的示例代码。
一 语法
  • C++11增加了基于范围的循环,语法如下:
attr(optional) for ( range_declaration : range_expression ) 
    loop_statement (until C++20)
attr(optional) for ( init-statement(optional)range_declaration : range_expression )
    loop_statement (since C++20)
二 举例
  • 应用于容器
{
    // 容器
    cout << "vc: ";
    std::vector<int> vc {1,2,3};
    for (auto i : vc) {
      cout << i << " ";
    }
    cout << endl;
}
  • 结果
vc: 1 2 3
  • 允许操作初值列和寻常的、大小已知的C-style array
{
  // C-Style 数组
  cout << "sz: ";
  int sz[] = {1, 2, 3};
  for (auto i : sz) {
    cout << i << " ";
  }
  cout << endl;
}
{
  // initialize_list
  cout << "list: ";
  for (auto i : {1, 2, 3}) {
    cout << i << " ";
  }
  cout << endl;
}
  • 结果
sz: 1 2 3
list: 1 2 3
三 相关算法
  • for_each
bool even(int n){
  if (n%2 ==0) {
    cout << n << " is even " << endl;
    return true;
  }
  return false;
}

{
  std::vector<int> vc{1, 2, 3};
  for_each(vc.begin(), vc.end(), even);
  cout << endl;
}
  • 结果
2 is even
  • for_each_n (C++17)
// for_each_n (C++17)
{
  std::vector<int> vc{1, 2, 3};
  for_each_n(vc.begin(), 2, even);
  cout << endl;
}
  • 结果(待测)
2 is even
四 参考
<think>首先,用户的问题是:“我想了解C++11中基于范围for循环的相关信息 请问C++11基于范围for循环介绍”。这直接要求我介绍C++11的基于范围for循环。 在系统级指令中,我有一些规则: - 使用中文回答。 - 行内数学表达式用$...$格式(但这个问题可能不涉及数学)。 - 独立公式用$$...$$格式(同样,可能不适用)。 - LaTeX语法正确(但这里主要是文本,不是数学)。 - 生成相关问题。 - 引用的段落末尾自然地添加引用标识,如[^1]。 用户提供了几个引用: - 引用[1]:介绍了基本语法和示例。 - 引用[2]:讨论了语法,包括只读和修改元素的情况。 - 引用[3]:展示了遍历数组和容器的代码示例。 - 引用[4]:强调了修改元素时需要引用形式变量。 用户说:“上述引用仅供参考,并不是用户真正的需求,请尽可能多的参考用户上一次的问题和你的回答。” 但在这个对话中,这是用户的第一次消息,我没有之前的回答。所以,我应该基于提供的引用回答。 关键点: - 回答要结构清晰,逐步解决问题。 - 使用中文。 - 最后生成相关问题。 结构化我的回答: 1. **介绍**:简要说明什么是基于范围for循环。 2. **基本语法**:描述语法结构。 3. **工作原理**:解释它是如何工作的。 4. **示例**:给出代码示例,展示如何使用。 5. **注意事项**:包括如何修改元素、使用引用提高效率等。 6. **生成相关问题**:结束时添加相关的问题。 从引用中提取核心信息: - **语法**:`for (declaration : range) { ... }` - **declaration**:可以是值、引用或const引用。 - **range**:可以是数组、容器等支持迭代的结构。 - **修改元素**:使用引用(`auto&`),而不是值。 - **效率**:使用const引用避免复制。 - **示例**:遍历数组、vector等。 确保回答真实可靠:基于提供的引用,这些都是标准的知识。 添加引用标识:在回答中自然地引用来源,比如提到语法时引用[1],修改元素时引用[4]。 生成相关问题:结束时添加几个相关问题,如优化、应用场景等。 最终回答结构: - 引言 - 语法部分 - 工作原理 - 示例代码块(使用代码格式) - 注意事项 - 生成相关问题 </think>### C++11 基于范围for 循环介绍 C++11 引入的基于范围for 循环Range-based for loop)极大地简化了容器、数组等序列的遍历操作,类似于 Python 或 Java 的增强 for 循环。它通过自动处理迭代过程,减少了手动管理迭代器的复杂性和错误风险。下面我将逐步介绍其核心概念、语法、工作原理和使用注意事项,确保内容准确可靠。 #### 1. **基本语法** 基于范围for 循环的基本语法如下: ```cpp for (declaration : range) { // 循环体 } ``` - **declaration**:声明一个变量,用于存储范围中的当前元素。可以是值类型、引用或 const 引用: - 只读取元素(不修改):使用值 (`int elem`) 或常量引用 (`const auto& elem`) 以提高效率,避免不必要的复制[^2]。 - 修改元素:必须使用引用 (`auto& elem`) 才能改变序列中的值[^4]。 - **range**:一个序列对象,如数组、容器(`std::vector`、`std::list`)或支持 `begin()` 和 `end()` 方法的自定义类型[^1]。 这种语法比传统 for 循环更简洁,易于阅读和维护。 #### 2. **工作原理** 编译器在底层自动将基于范围for 循环转换为使用迭代器的形式: - 循环开始时,调用 `range.begin()` 和 `range.end()` 获取序列起始和结束位置。 - 每次迭代自动解引用迭代器,并将元素赋值给 `declaration` 变量。 - 不支持手动跳过或修改迭代位置(需使用传统 for 循环处理复杂逻辑)[^1][^3]。 这种设计确保了安全性,避免了迭代器越界错误,适用于大多数标准库容器和数组。 #### 3. **代码示例** 以下是常见使用场景的代码示例,基于引用内容: **示例 1: 遍历数组(只读)** ```cpp #include <iostream> int main() { int arr[] = {1, 2, 3}; for (int num : arr) { // 值类型,不修改元素 std::cout << num << " "; // 输出: 1 2 3 } return 0; } ``` *输出结果:1 2 3*[^3] **示例 2: 遍历容器并修改元素** ```cpp #include <iostream> #include <vector> int main() { std::vector<char> vec = {'a', 'b', 'c'}; for (auto& ch : vec) { // 引用类型,可修改元素 ch = toupper(ch); // 将小写字母转为大写 } for (const auto& ch : vec) { // const 引用,高效只读 std::cout << ch << " "; // 输出: A B C } return 0; } ``` *输出结果:A B C*[^4] **示例 3: 遍历字符串数组** ```cpp #include <iostream> #include <vector> int main() { char arc[] = "C++11"; for (char ch : arc) { // 遍历字符串数组 std::cout << ch; // 输出: C++11 } return 0; } ``` *输出结果:C++11*[^3] #### 4. **注意事项** - **修改元素**:若需修改序列中的元素,必须使用引用声明(如 `auto& elem`)。否则,元素不会被更新[^4]。 - **效率优化**:对于大型对象(如字符串或自定义类),推荐使用 `const auto& elem` 避免复制开销[^2][^4]。 - **适用范围**:序列必须支持 `begin()` 和 `end()` 方法,包括标准容器(`std::vector`, `std::array`)、原生数组和用户自定义类型[^1][^3]。 - **局限性**:不支持动态调整序列大小(如删除元素),可能导致未定义行为。复杂逻辑需结合传统循环[^1]。 基于范围for 循环C++11 的核心特性之一,提升了代码可读性和开发效率。它在数据处理、算法实现中广泛应用,如遍历集合进行过滤或转换[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值