C++ 基础

C++ 主页 C++ 概述 C++ 环境设置 C++ 基本语法 C++ 注释 C++ Hello World C++ 省略命名空间 C++ 标记 C++ 常量/字面量 C++ 关键字 C++ 标识符 C++ 数据类型 C++ 数字数据类型 C++ 字符数据类型 C++ 布尔数据类型 C++ 变量类型 C++ 变量作用域 C++ 多变量 C++ 基本输入/输出 C++ 修饰符类型 C++ 存储类 C++ 数字 C++ 枚举 C++ 枚举类 C++ 引用 C++ 日期和时间

C++ 运算符

C++ 运算符 C++ 算术运算符 C++ 关系运算符 C++ 逻辑运算符 C++ 位运算符 C++ 赋值运算符 C++ sizeof 运算符 C++ 条件运算符 C++ 逗号运算符 C++ 成员运算符 C++ 强制类型转换运算符 C++ 指针运算符 C++ 运算符优先级 C++ 一元运算符

C++ 控制语句

C++ 决策语句 C++ if 语句 C++ if else 语句 C++ 嵌套 if 语句 C++ switch 语句 C++ 嵌套 switch语句 C++ 循环类型 C++ while 循环 C++ for 循环 C++ do while 循环 C++ Foreach 循环 C++ 嵌套循环 C++ break 语句 C++ continue 语句 C++ goto 语句

C++ 字符串

C++ 字符串 C++ 循环遍历字符串 C++ 字符串长度 C++ 字符串连接 C++ 字符串比较

C++ 函数

C++ 函数 C++ 多函数参数 C++ 递归函数 C++ 返回值 C++ 函数重载 C++ 函数重写 C++ 默认参数

C++ 数组

C++ 数组 C++ 多维数组 C++ 指向数组的指针 C++ 将数组传递给函数 C++ 从函数返回数组

C++ 结构 &联合

C++ 结构 C++ 联合

C++ 指针

C++ 指针 C++ 解引用 C++ 修改指针

C++ 类和对象

C++ 面向对象 C++ 类 &对象 C++ 类成员函数 C++ 类访问修饰符 C++ 静态类成员 C++ 静态数据成员 C++ 静态成员函数 C++ 内联函数 C++ this 指针 C++ 友元函数 C++ 指向类的指针

C++ 构造函数

C++ 构造函数 &析构函数 C++ 默认构造函数 C++ 参数化构造函数 C++ 复制构造函数 C++ 构造函数重载 C++ 带默认参数的构造函数 C++ 委托构造函数 C++ 构造函数初始化列表 C++ 使用构造函数动态初始化

C++ 继承

C++ 继承 C++ 多重继承 C++ 多级继承

C++ 面向对象

C++ 重载 C++ 多态性 C++ 抽象 C++ 封装 C++ 接口 C++ 虚函数 C++ 纯虚函数与抽象类

C++ 文件处理

C++ 文件和流 C++ 文件读取

C++ 进阶

C++ 异常处理 C++ 动态内存 C++ 命名空间 C++ 模板 C++ 预处理器 C++ 信号处理 C++ 多线程 C++ Web 编程 C++ 套接字编程 C++ 并发 C++ 高级概念 C++ Lambda 表达式 C++ unordered_multiset

C++ 实用资源

C++ 问答 C++ 快速指南 C++ 速查表 C++ STL 教程 C++ 标准库 C++ 实用资源 C++ 讨论


C++ 中的 Foreach 循环

Foreach 循环也称为基于范围 for 循环,它是一种简单易读的方式,可以遍历容器(如数组、向量、列表)中的元素,而无需执行任何额外操作,例如初始化、递增/递减、循环终止或退出条件。

语法

以下是 for each 循环的语法 -

for( data_type element_variable__name : container_name ){
    // 要执行的代码
}

这里,

  • element_variable_name 是赋给存储在容器中的元素。
  • container_name 是任意类型容器的变量名,例如数组、向量、列表等。

Foreach 循环如何工作?

  • foreach 循环遍历给定容器的所有元素。该过程从第一个元素开始,并将其赋值给变量,作为 element_variable_name,如代码所示。
  • 然后,循环执行 for each 循环的主体,允许您操作或使用这些元素。
  • 处理完当前元素后,循环移至容器中的下一个元素。
  • 此过程重复进行,直到到达容器的最后一个元素。

Foreach 循环示例

在此示例中,基于范围的 for 循环带有引用 (int& num) ,允许您直接修改 向量中的每个元素。

#include <iostream>
#include <vector>
using namespace std;

int main() {
   vector<int> digits = {10, 20, 30, 40, 50};

   // 基于范围的 for 循环来修改每个元素
   for (int& num : digits) {
      num *= 2; // Double each number
   }

   for (int num : digits) {
      cout << num << " ";
   }
   cout << endl;

   return 0;
}

输出

20 40 60 80 100

向量的 foreach 循环

foreach 循环可用于迭代向量元素。

示例

在此示例中,我们使用 foreach 循环迭代并打印向量元素

#include <iostream>
#include <vector>
using namespace std;
int main() {
   vector<int> numbers = {1, 2, 3, 4};

   for (int num : numbers) {
      cout << num << " ";
   }
   return 0;
}

输出

1 2 3 4 

使用列表的 foreach 循环

类似地,foreach 循环也可用于迭代 列表 元素。

示例

在此示例中,我们使用 foreach 循环迭代并打印列表元素

#include <iostream>
#include <list>

int main() {
   using namespace std;

   list<int> numbers = {10, 20, 30, 40, 50};

   for (int num : numbers) {
      cout << num << " ";
   }
   cout << endl;

   return 0;
}

输出

10 20 30 40 50 

For 循环 vs. Foreach 循环

for 循环根据给定条件执行一组语句,而 foreach 循环(或基于范围的 for 循环)则迭代集合元素。 请参考以下示例,了解 C++ 中 for 和 foreach 的区别 -

标准方法:for 循环

以下是 for 循环的示例,其中我们打印一个整数数组的元素 -

#include<iostream>
using namespace std;

int main() {
    // 一个数组
    int arr[] = {1,2,3,4};
    
    // 使用 for 循环打印数组元素
   for (int i = 0; i <= 3; i++) {
      cout << i<<" ";
   }
   return 0;
}

输出

0 1 2 3

Foreach 循环方法

以下是 foreach 循环的示例,其中我们迭代并打印整数数组的元素 -

#include<iostream>
using namespace std;
int main() {
   int arr[] = {1,2,3,4};
   // 其中 x 是提供给的变量名称
   // 容器内的元素
   for(int x: arr) {    
      cout<< x<<" ";
   }
   return 0;
}

输出

1 2 3 4

非容器类型的 Foreach 循环

通常,foreach 循环用于对数组、向量、列表、双端队列、集合和映射等容器类型进行迭代,但它也用于可迭代的非容器类型,这意味着它必须具有返回迭代器的 begin()end()

像向量这样的传统容器以及上面提到的所有其他容器本身就满足这些要求,因此我们不需要专门为其指定 begin() 和 end()。

示例

以下示例演示了 foreach 循环如何与非容器类型元素配合使用 -

#include <iostream>
#include <vector>
using namespace std;
class Iterable {
   public:
      // 带有初始化列表的构造函数
      Iterable(const vector<int>& v) : values(v) {}

      // 提供 begin() 和 end() 方法
      auto begin() const -> vector<int>::const_iterator {
         return values.begin();
      }
      auto end() const -> vector<int>::const_iterator {
         return values.end();
      }

   private:
      vector<int> values;
};

int main() {
   Iterable myIterable({1, 2, 3, 4, 5});

   for (int num : myIterable) {
      cout << num << " ";
   }
   cout << endl;

   return 0;
}

输出

1 2 3 4 5 

这里

  • 在上面的代码中,begin() 方法返回一个指向容器第一个元素的迭代器,而 end() 方法返回一个指向容器最后一个元素之后一个位置的迭代器。
  • 然后使用 for() 循环迭代迭代器,遍历向量的每个元素/值,并将每个值打印到控制台。

Foreach 循环的优势

在 C++ 中使用 Foreach 循环的优势如下:

  • 简单 − 减少样板代码。
  • 可读性 − 与 for、while 和 do-while 等传统循环方法相比,它提供了一种简单易读的代码编写方式。
  • 安全性 − 减少与索引管理和边缘相关的错误情况。

Foreach 循环的局限性

以下是 foreach 循环的一些局限性 -

  • 仅限于正向遍历 - 它不允许以反向顺序进行迭代。
  • 不可中断遍历 - 在到达最后一个索引或最后一个元素之前,无法跳过任何元素或中断迭代。
  • 迭代时无法直接访问元素 - 在通过 foreach 循环进行迭代时,无法直接访问当前元素的索引或位置。

Foreach 循环的应用

  • 只读迭代 - 当用户想要迭代元素而不任何修改都适用,因为 foreach 循环提供了更简洁的代码。
  • 遍历容器 − 当我们想要遍历任何类型的容器(例如数组、列表、向量)时,foreach 循环非常有用,因为此循环简化了对容器元素进行迭代的过程。
  • 简单修改 − 当我们想要执行任何简单操作时,它都很有用,因为与编写迭代代码的旧标准方法相比,它提供了简单、易读的代码。
  • 使用非容器类型 − 它也适用于任何满足可迭代要求的类型,包括 begin() 和 end()。