主页
  • 主页
  • 分类
  • 热文
  • 教程
  • 面试
  • 标签
C++

C++ 基础

C++ 主页
C++ 概述
C++ 环境
C++ 基本语法
C++ 注释
C++ 数据类型
C++ Hello, World
C++ 省略命名空间
C++ 数值类型
C++ 字符类型
C++ 布尔类型
C++ 变量
C++ 作用域
C++ 多个变量
C++ 输入输出基础
C++ 常量/文字
C++ 修饰符类型
C++ 存储类别
C++ 操作符
C++ 决策结构
C++ 循环结构
C++ foreach 循环
C++ 数字
C++ 数组
C++ 指针
C++ 枚举类型
C++ 引用变量
C++ 日期与时间
C++ 结构体
C++ 联合类型

C++ 字符串

C++ 字符串
C++ 字符串长度
C++ 字符串连接

C++ 函数

C++ 函数
C++ 多参数函数
C++ 递归
C++ return 语句
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++ 环境
C++ 基本语法
C++ 注释
C++ 数据类型
C++ Hello, World
C++ 省略命名空间
C++ 数值类型
C++ 字符类型
C++ 布尔类型
C++ 变量
C++ 作用域
C++ 多个变量
C++ 输入输出基础
C++ 常量/文字
C++ 修饰符类型
C++ 存储类别
C++ 操作符
C++ 决策结构
C++ 循环结构
C++ foreach 循环
C++ 数字
C++ 数组
C++ 指针
C++ 枚举类型
C++ 引用变量
C++ 日期与时间
C++ 结构体
C++ 联合类型

字符串

C++ 字符串
C++ 字符串长度
C++ 字符串连接

函数

C++ 函数
C++ 多参数函数
C++ 递归
C++ return 语句
C++ 函数重载
C++ 函数重写

面向对象

C++ 面向对象
C++ 类和对象
C++ 多重继承
C++ 多层次继承
C++ 继承
C++ 重载
C++ 多态性
C++ 抽象
C++ 封装
C++ 接口

高级

C++ 文件和流
C++ 异常处理
C++ 动态内存
C++ 命名空间
C++ 模板
C++ 预处理器
C++ 信号量
C++ 多线程
C++ Web 编程
C++ 高级概念

C++ foreach 循环


上一章 下一章

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

语法

foreach 循环的语法如下:

for( 数据类型 元素变量名 : 容器名 ){
   // 需要执行的代码
}

这里,

  • 元素变量名 是给定容器中元素的变量名。
  • 容器名 是任何类型的容器变量名,如数组、向量、列表等。

foreach 循环如何工作?

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

foreach 循环示例

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

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

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

   // 基于范围的 for 循环来修改每个元素
   for (int& num : digits) {
      num *= 2; // 将每个数字翻倍
   }

   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>
using namespace std;
int main() {
   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 循环的优点

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

foreach 循环的局限性

  • 仅限向前遍历 —— 它不允许反向迭代。
  • 不可中断的遍历 —— 在到达最后一个索引或最后一个元素之前没有选项可以跳过任何元素或中断迭代。
  • 迭代时无直接访问元素 —— 在 foreach 循环迭代过程中无法直接访问当前元素的索引或位置。

foreach 循环的应用

  • 只读迭代 —— 当用户想要在不进行任何修改的情况下遍历元素时,foreach 循环是一个不错的选择,因为它提供了更干净简单的代码。
  • 遍历容器 —— 当我们要遍历任何类型的容器(如数组、列表、向量)时,foreach 循环是有用的,因为这个循环简化了遍历容器元素的过程。
  • 简单修改 —— 当我们需要执行任何简单操作时,它有用,因为它相比旧的标准迭代代码编写方法给出了更简单、更容易阅读的代码。
  • 非容器类型的工作 —— 它同样适用于满足可迭代需求的任何类型,即包含 begin() 和 end() 的类型。
上一章 下一章
阅读号二维码

关注阅读号

联系二维码

联系我们

© 2024 Yoagoa. All rights reserved.

粤ICP备18007391号

站点地图