【C++】我对 ”范围for循环“ 的理解

我的题外话,可以直接跳过,没事

我与范围for循环的结缘是在牛客网的刷题中,我当时看到了别人的这个方法,当时也是思考了很久,奈何当时的种种限制,我并没有很深刻的去学习它,那么,在这里我希望我写的能对你们有所帮助! 在这里插入图片描述

关于范围for循环

基本上,你只要不是编程小白,那么for循环肯定都是知道的,不过你知道在c++11中引进的范围for循环吗,它是关于for循环的更加简洁的写法,不过它也不是万能的,以下:

范围for循环的表达式如下:

for (声明 : 表达式)
	语句;
	

补充: 以上因为语句为一个,所以没有加上代码块,这是系统允许的,很多语言都是可以这样写的,所谓的代码块就是**{ }**; 比如:

for (声明 : 表达式){
	语句;
	语句;
}

当你写的代码的逻辑行超过2时,就需要用代码块来约束它,这里牵扯到了逻辑行与物理行的概念,可以自行去搜索

根据以上,我们来一步一步揭开它神秘的面纱:

one:   for()  你在告诉编译器要干什么,创建一个for循环

two:   声明   所谓的声明就是定义 循环变量 ,要确保原序列中的元素
			  可以转化为定义的循环变量,说白了,就是要保持一样的
			  数据类型
			  
three: 表达式   表达式必须是一个序列!序列!序列!就像数组,string
			    还有vector等等一样,说白了,共同点就是拥有返回
				迭代器的begin()与end()成员

直接上代码

#include <iostream>
#include <string>//因为使用了 getline来输入,需要这个头文件
using namespace std;

int main() {
	string pmc;
	getline(cin, pmc);//给string类型的 pmc 取值
	
	for (int i = 0; i < pmc.length()/*或者 pmc[i]!= '\0' */; ++i)
		cout << pmc[i] << " ";
	//以上为正常的 for循环
		
	cout << endl;//换行
	
	for (char s : pmc)
		cout << s << " ";
	//以上为 范围for 循环
	return 0;
}

输入输出结果如下:

hello//输入
h e l l o//第一种普通for循环的结果
h e l l o//第二种范围for循环的结果

接下来我们把它单独的拿出来看:

for (char s : pmc)                for (声明 : 表达式)
		cout << s << " ";			       语句;
结合上面的总结一起看		
one:   for()  你在告诉编译器要干什么,创建一个for循环

two:   声明   所谓的声明就是定义 循环变量 ,要确保原序列中的元素
			  可以转化为定义的循环变量,说白了,就是要保持一样的
			  数据类型
			  
three: 表达式   表达式必须是一个序列!序列!序列!就像数组,string
			    还有vector等等一样,说白了,共同点就是拥有返回
				迭代器的begin()与end()成员

以上就是非常基础的关于范围for循环的,我所能说清的知识了,希望对你 能有帮助,那不妨帮忙

当然接下来留下一些进阶点的干货

到这里,其实学过迭代器的人都应该了解了,这个所谓的范围for循环其实就是关于迭代器的知识,不了解的读者也没关系,你只要知道,它是一种通用的元素访问机制就可以了

auto:

关于auto的秒用:
for (auto s : pmc)                for (声明 : 表达式)
		cout << s << " ";			       语句;

根据之前的知识,我们知道,声明里定义了循环变量,序列中的每个元素都要能转换为循环变量的类型,既保持一样的数据类型,而确保类型相容最简单的方法就是使用auto,让系统根据序列返回的类型,来为循环变量定义类型

引用类型&:

这里给2个代码,大家看看区别

1号:
	string pmc;
	getline(cin, pmc);
	for (auto& s : pmc)
		s += 1;
	for (int i = 0; i < pmc.size()/*pmc.length()*/ ; ++i)
		cout << pmc[i] << " ";
2号:
	string pmc;
	getline(cin, pmc);
	for (auto s : pmc)
		s += 1;
	for (int i = 0; i < pmc.size()/*pmc.length()*/ ; ++i)
		cout << pmc[i] << " ";

这里仔细看就会发现,只有一个 引用类型& 的区别 那么我输入 123456 时,大家觉得1号与2号会有啥区别呢? 如下:

123456
2 3 4 5 6 7//1号结果

123456
1 2 3 4 5 6//2号结果

这里直接说结论了,当我们需要对序列中的元素执行 写操作 时,循环变量必须声明成引用类型,如果你不知道啥是写操作,没事,在这里你可以理解为,因为需要改变原序列的值,所以要把循环变量声明为&类型

以上,是我对范围for循环的了解,希望对大家都有用,既然都看到了这里,我要一个免费的也是可以的吧,哈哈哈

最后的最后,表达式一定要是序列啊!序列序列

全部评论

相关推荐

粗心的雪碧不放弃:纯学历问题,我这几个月也是一直优化自己的简历,后来发现优化到我自己都觉得牛逼的时候,发现面试数量也没有提升,真就纯学历问题
点赞 评论 收藏
分享
7 1 评论
分享
牛客网
牛客企业服务