我的题外话,可以直接跳过,没事
我与范围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循环的了解,希望对大家都有用,既然都看到了这里,我要一个免费的赞也是可以的吧,哈哈哈
最后的最后,表达式一定要是序列啊!序列!序列!