C++ 中基于范围的 for 循环和基于迭代器的 for 循环之间的区别

2025 年 5 月 12 日 | 阅读 6 分钟

在本文中,我们将讨论 C++ 中基于范围的 for 循环与基于迭代器的 for 循环之间的区别。在讨论它们之间的区别之前,我们必须了解 C++ 中基于范围的 for 循环和基于迭代器的 for 循环,包括它们的语法、参数和示例。

C++ 中的基于范围的 For 循环是什么?

C++ 中的范围 for 循环被认为是一种简单的语法,可用于迭代容器类型(如数组、向量或其他具有可迭代属性的对象)中的元素。它使得不必编写会遍历容器中每个单独元素的循环,因为系统会自动处理迭代逻辑。因此,不必手动声明索引和迭代器。这种循环非常适合顺序遍历容器,为程序员提供了一种在不使用繁琐的传统循环的情况下遍历容器全部内容的方法。

通过范围 for 循环编写代码的性质以及其迭代方式并不复杂。常规迭代器会按顺序从第一个元素移动到最后一个元素。

正如其名称所示,范围 for 循环允许用户创建要在指定范围内迭代的循环。

语法

它具有以下语法:

如上所述,对于这种语法,可以注意到三个参数:

  • range_declaration: 它描述了一个变量,该变量的类型与参数 range_expression 中的元素类型相同,或者是一个引用。
  • range_expression: 它寻址一个指定所需序列中元素顺序的位置表达式。

示例

输出

 
20 40 60 80 100    

说明

此处,所描述的 C++ 程序使用基于范围的 for 循环来操作和打印向量值。它首先包含输入和输出以及向量容器所需的头文件。在 main 函数中,创建了一个名为 num 的向量,并用五个整数 10、20、30、40 和 50 初始化。在第一个基于范围的 for 循环中,通过引用访问向量的元素,并在过程中将它们的值加倍。这意味着 10 变为 20,然后 20 变为 40,依此类推。在此步骤之后,使用第二个基于范围的 for 循环遍历已复制上述元素的向量,输出为 20 40 60 80 100。

C++ 中的基于迭代器的 For 循环是什么?

C++ 中的基于迭代器的 for 循环是非常有用的功能,它们能够遍历数组、向量、列表以及许多其他容器。它们使与元素的交互变得非常简单和明确,并提供了对迭代的更多控制。

什么是迭代器?

迭代器是一种抽象,它允许按顺序访问容器元素,同时隐藏底层容器。它类似于指针,因为它使用户能够以连续的方式从一个元素移动到另一个元素。

基于迭代器的 for 循环的基本语法是声明一个指针,初始化一个迭代器,测试迭代器的有效性,然后递增指针。

语法

它具有以下语法:

  • begin(): 此成员函数返回指向容器中第一个元素的迭代器。
  • end(): 此成员函数返回一个指向最后一个元素之后位置的迭代器。
  • *it: 使用 *it 通过解引用迭代器来访问当前迭代的元素。

示例

让我们举一个例子来说明 C++ 中的基于迭代器的 for 循环。

输出

 
10 20 30 40 50    

说明

在上面的程序中,一个名为 num 的整数向量被初始化并赋值为五个值:10、20、30、40 和 50。实现的循环将它指向的每个元素与每个元素之间的空格一起打印到标准输出。即,迭代完成后,程序打印换行符以增强输出格式,然后进行最后的返回。程序的输出预计为“10 20 30 40 50”。

C++ 中基于范围的 For 循环与基于迭代器的 For 循环之间的主要区别

基于范围的 For 循环和基于迭代器的 For 循环在 C++ 中有几个关键区别。一些主要区别如下:

方面基于范围的 For 循环基于迭代器的 For 循环
初始化在这种情况下,循环变量不需要任何初始化的属性。这与经典样式不同,后者甚至需要初始化迭代器,包括 .begin() 和 .end() 分隔符。
性能编译器用于代码的通用优化,使其与使用迭代器大致相同。自定义或复杂的迭代器在这方面似乎表现更好。
容器兼容性高级样式要求容器与支持 for 循环的抽象数据类型一起工作,其中使用迭代器(自 C++11 起)。标准容器和自定义容器的集成不是问题。
编译时检查编译器在编译阶段执行容器兼容性检查。如果迭代器未得到充分检查或验证,则更容易出现运行时错误。
嵌套循环对于嵌套迭代来说效率较低,因为多维容器需要额外的逻辑。对于嵌套循环更有效,因为迭代器可以轻松重用。
性能开销由于大多数是为简单用例设计的,因此预计开销极小。根据迭代器的类型,特别是更复杂的容器,这可能会产生略高的开销。
错误处理它允许的与迭代器相关的错误更少(例如,一次性错误)。其他错误更容易发生,例如解引用无效迭代器或超出范围。
用例它仅用于需要简单迭代的问题或情况。它对于更复杂的逻辑迭代很有用,例如过滤、反转或跳过元素。
可读性它更容易理解,代码更简洁。应仔细注意迭代器及其管理。

结论

总之,C++ 有两种循环结构;两者在各自的特定编程需求方面都非常有效:基于范围的 for 循环基于迭代器的 for 循环。基于范围的循环最适合简单的序列,因为它们使用简单的语法和自动的起始点和结束点,使序列易于理解。它们还使开发人员能够在不冒控制索引或迭代器本身风险的情况下遍历容器。

相比之下,由于其底层复杂性允许遍历甚至修改操作,因此基于迭代器的 for 循环在控制方面更好。它们在需要精确控制元素的场景中非常重要,但主要缺点是迭代器控制不当可能导致错误。总而言之,两者之间的选择取决于任务的需求,同时始终努力在简单性和控制之间取得平衡,以在代码中实现最佳性能、可维护性和可读性。


下一个主题C++ 中的 std::lerp