产生原因:范围遍历需要优化
在C语言中,编译可以通过连续空间的下标访问,非连续空间的指针访问的for循环结构,这解决了范围遍历的问题——从头至尾的访问存储空间,但是他们都有着存储的功能,然而却没有提供数据管理的方法,这就使得使得我们需要自己去设计方法,这不符合交给对象的思想, 因此要在其上进行再封装,以实现范围遍历的自动的方法处理,由此基础上的产生————(两者合并的)对应下标的for循环的基于一定范围的范围for。
形式:
遍历访问一般格式
for(迭代变量定义:迭代范围起始处)// 等效于 for(迭代变量的定义及初始化;迭代变量的范围判断;迭代变量的迭代)
{}; // {};
由此可看出范围for本质上是对for循环的写入了方法
eg。已连续的空间为例
int num [] = {2l,3,4,34,323,324,456,23}; for (int e : num) { //..... }
int :是由与数据类型决定的;
int e:定义一个与源数据类型相同的临时变量。
num:是数据的起始地址(数组名)。
int e : num 的4重功能:定义的拷贝变量由num赋值;将拷贝变量的值解引用给e;由拷贝变量进行判断是否到边界;拷贝变量进行迭代
对迭代变量的类型进行优化,
与auto结合,增加兼容性
#include<iostream> using std::endl; using std::cout; int main () { char string [] = "stl resource!"; for ( auto e : string ) { cout<<e; } cout << endl; }
范围for与auto类型的结合,使得e可接受更多类型变量而不用改变类型
与应用结合,实现修改
using std::endl; using std::cout; using std::cin; int main () { char temp [11 ]; for ( char& e : temp ) { cin>>e; //cin不读换行符的 } for (auto e:temp) { cout <<e; } cout << endl; }
因为引用是对变量起别名,也就是通过拷贝份改原份,故可起到修改的作用,等校友配合指针的for循环
注意:
因为auto类型的变量定义时需要正确的,而非其地址,所以此时是不能使用auto的
使用条件:有明确的范围
因为范围for的方法是固定的,判断它范围的依据要求是被迭代的数据自身所带有的。如下
数组的首元素与尾元素。
指针的范围
因为仅指针而言,它是没有边界一说的(它没有自带的边界),所以在范围for中的e是不会直接使用指针类型的,当然并不是说不是说不用,而是不直接用,而是在指针的基础上套上一层壳以做边界,各类数据结构的begin与end
暂时将其视作数组的下标访问的循环结构的优化,其他用法体现在容器中。