C++从入门到精通——范围for的使用

范围for的使用


前言

范围for循环(也称为C++11的基于范围的for循环)是一种简化迭代容器(如数组、向量、列表等)元素的方式。它允许你遍历容器中的每个元素而无需显式地使用迭代器或索引。基本语法是:for (元素类型 元素变量 : 容器) { // 循环体 }。这种循环内部隐式使用迭代器来遍历容器,使得代码更简洁易读。但需要注意的是,范围for循环不适用于需要修改容器大小或结构的场景,因为它不提供对迭代器的直接访问。


一、(引言)python中for循环的使用

Python中的for循环用于迭代遍历一个可迭代对象(如列表、字符串、元组或字典),并对其中的每个元素执行相应的操作。具体使用方式如下:

在Python中,for循环的基本语法如下:

python 复制代码
for item in iterable:
    # 执行代码块

其中,item是循环变量,用于依次遍历iterable对象中的元素。

下面是对每个部分的解释:

  • item:循环变量,用于指代iterable中的当前元素。
  • iterable:可迭代对象,即可以按顺序遍历的对象,如列表、字符串、元组、字典、集合等都是可迭代对象。
  • ::冒号用于标志代码块的开始。
  • # 执行代码块:在循环中要执行的代码块,可以包含一个或多个语句。

在每次循环中,item会依次取iterable中的元素,然后执行一次代码块,直到遍历完所有元素为止。

注意事项:

  • 循环变量item在循环体内部定义,并且只在循环体内部有效。
  • 可以通过break语句提前结束循环。
  • 可以通过continue语句跳过当前迭代,直接进入下一次迭代。

下面是一个示例代码,演示了for循环的完整语法:

python 复制代码
fruits = ['apple', 'banana', 'cherry']

for fruit in fruits:
    print(fruit)
    if fruit == 'banana':
        break
    if fruit == 'cherry':
        continue
    print('This statement will not be executed if fruit is cherry.')

输出:

python 复制代码
apple
banana

二、C++中的范围for

C++中的范围for和python类似,都是基于自由变量的基础上,不需要像C语言那样写很多的代码,python的写法只是引例,大家可以按照自己的需求选择性了解

C语言中的for循环

C语言中的for循环是一种控制流语句,用来重复执行一段代码块。它的一般格式如下:

c 复制代码
for (初始化表达式; 条件表达式; 更新表达式) {
    // 循环体
}

其中,初始化表达式用于初始化循环变量;条件表达式用于判断是否继续执行循环体;更新表达式用于更新循环变量的值。

for循环的执行过程如下:

  1. 执行初始化表达式,用于初始化循环变量。
  2. 执行条件表达式,判断是否满足条件。如果条件为真,则执行循环体;如果条件为假,则退出循环。
  3. 执行循环体中的代码,执行完毕后执行更新表达式。
  4. 回到步骤2,再次执行条件表达式。如果条件为真,则继续执行循环体;如果条件为假,则退出循环。重复这个过程,直到条件为假为止。

for循环中,循环变量是一个局部变量,只在循环体中有效。循环变量的作用是控制循环的次数。

下面是一个使用for循环计算1到10的和的示例代码:

c 复制代码
#include <stdio.h>

int main() {
    int sum = 0;  // 初始化和为0

    for (int i = 1; i <= 10; i++) {  // i从1递增到10
        sum += i;  // 累加到sum中
    }

    printf("1到10的和为:%d\n", sum);

    return 0;
}

输出结果为:1到10的和为:55

C++中的范围for的语法

不使用范围for的正常写法

在C++98中如果要遍历一个数组,可以按照以下方式进行:

cpp 复制代码
void TestFor()
{
	 int array[] = { 1, 2, 3, 4, 5 };
	 for (int i = 0; i < sizeof(array) / sizeof(array[0]); ++i)
	     array[i] *= 2;
 
	 for (int* p = array; p < array + sizeof(array)/ sizeof(array[0]); ++p)
	     cout << *p << endl;
}

与上面的C语言的for循环相比,很类似,但是对于一个有范围的集合而言,由程序员来说明循环的范围是多余的,有时候还会容易犯错误。因此C++11中引入了基于范围的for循环。for循环后的括号由冒号" :"分为两部分:

  • 第一部分是范围内用于迭代的变量
  • 第二部分则表示被迭代的范围。

范围for的写法

C++中的范围for循环的语法如下:

cpp 复制代码
for (element_declaration : range_expression) {
   // 循环体
}

其中,element_declaration是用来声明一个变量,这个变量将用于遍历range_expression的每个元素。range_expression是一个序列(如数组、容器、字符串等),表示要遍历的一系列元素。

在循环体中,可以使用element_declaration来访问当前正在遍历的元素。

下面示例,演示了如何使用范围for循环遍历一个数组:

正常范围for
cpp 复制代码
int arr[] = {1, 2, 3, 4, 5};

for (int x : arr) {
   cout << x << " ";
}

输出结果为:1 2 3 4 5

在这个示例中,element_declaration使用int类型声明了一个变量xrange_expression是数组arr。在每次循环中,x将依次取数组arr中的每个元素,然后输出到屏幕上。

auto自动推导范围for
cpp 复制代码
void TestFor()
{
 	int array[] = { 1, 2, 3, 4, 5 };
 	for(auto& e : array)
     	e *= 2;
 
 	for(auto e : array)
     	cout << e << " ";
 
 	return 0;
}

这段代码是一个示例函数TestFor(),展示了在C++中使用范围for循环对数组进行遍历和修改的操作。

首先,创建了一个整型数组array,包含了五个元素。

cpp 复制代码
int array[] = { 1, 2, 3, 4, 5 };

接下来,使用范围for循环对数组进行遍历,并使用引用来修改每个元素。循环中的auto& e是用于声明一个引用变量e(自动推断类型),表示当前遍历到的元素。然后通过e *= 2将元素的值乘以2。

cpp 复制代码
for (auto& e : array)
    e *= 2;

完成遍历和修改后,再次使用范围for循环,将修改后的数组元素逐个输出到屏幕。循环中的auto e是用于声明一个自动推断类型的变量e,表示当前遍历到的元素的副本。

cpp 复制代码
for (auto e : array)
    cout << e << " ";

最终输出结果为:2 4 6 8 10

注意:

  • 想修改数组元素必须要使用&引用操作符(auto&int& 及其他)
  • 不使用&引用操作符,只是对原数组的一份拷贝,不会修改原数组
  • 与普通循环类似,可以用continue来结束本次循环,也可以用break来跳出整个循环。

三、范围for的使用条件

for循环迭代的范围必须是确定的

对于数组而言,就是数组中第一个元素和最后一个元素的范围;对于类而言,应该提供beginend的方法,beginend就是for循环迭代的范围。

注意:以下代码就有问题,因为for的范围不确定

cpp 复制代码
void TestFor(int array[])
{
    for(auto& e : array)
        cout<< e <<endl;
}

迭代的对象要实现++和==的操作

关于这个问题,我将在后续文章进行讲解,敬请期待,现在先了解一下基础概念

迭代器

迭代器(Iterator)是一种对象,用于遍历容器中的元素。它提供了一种统一的访问容器元素的方式,使得用户可以通过相同的方式访问不同类型的容器。

迭代器一般具有以下操作:

  • 通过*运算符获取当前迭代器指向的元素
  • 通过++运算符将迭代器向后移动到下一个元素
  • 通过==运算符判断两个迭代器是否相等
  • 通过!=运算符判断两个迭代器是否不相等

使用范围for循环时,可以使用迭代器来表示集合的起始位置和结束位置,范围for循环会自动遍历整个集合中的元素,不需要手动控制迭代器的移动和判断。这样就避免了使用传统的for循环需要手动管理迭代器的复杂性。

相关推荐
老猿讲编程22 分钟前
一个例子来说明Ada语言的实时性支持
开发语言·ada
UestcXiye1 小时前
《TCP/IP网络编程》学习笔记 | Chapter 3:地址族与数据序列
c++·计算机网络·ip·tcp
Chrikk1 小时前
Go-性能调优实战案例
开发语言·后端·golang
幼儿园老大*1 小时前
Go的环境搭建以及GoLand安装教程
开发语言·经验分享·后端·golang·go
canyuemanyue1 小时前
go语言连续监控事件并回调处理
开发语言·后端·golang
考试宝1 小时前
国家宠物美容师职业技能等级评价(高级)理论考试题
经验分享·笔记·职场和发展·学习方法·业界资讯·宠物
杜杜的man1 小时前
【go从零单排】go语言中的指针
开发语言·后端·golang
测开小菜鸟1 小时前
使用python向钉钉群聊发送消息
java·python·钉钉
好奇龙猫2 小时前
【学习AI-相关路程-mnist手写数字分类-win-硬件:windows-自我学习AI-实验步骤-全连接神经网络(BPnetwork)-操作流程(3) 】
人工智能·算法
P.H. Infinity2 小时前
【RabbitMQ】04-发送者可靠性
java·rabbitmq·java-rabbitmq