用范围for语句遍历Vector对象,并且改变其内容。
vector<int> V{1,2,3,4,5,6,7,8,9,0}; for(auto &i : V) { i*=i; } for(auto i : V) { cout<<i<<endl; }
开始我以为运用for遍历一个对象后,即可以对遍历的对象可做更改,但是当我实际操作的时候,发现并不能更改,然后查阅了一下别人的思路,最后才得出一个结论:
上述代码中,i 变量作用于遍历V操作对象成员数据,但不能更改,就相当于你可以搬运它,但你依旧不是它。所以你不能对它本身做任何操作。而当定义成为一个引用之后,当你遍历的时候,你绑定于V成员数据,自然可以对i进行操作。
iterator
所有标准库容器都可以使用迭代器,例如:vector、string(严格意义上不属于标准容器)
vector<T> V
vector<T> ::iterator it=V.begin()
string var
string ::iterator it=var.begin()
it返回一个iterator 对象,类似于指针,它指向容器最开始的元素
vector<T> V
vector<T> ::iterator it=V.end()
string var
string ::iterator it=var.end()
此处的it返回的是容器最后一个元素的下一个位置,那就意味这在容器内部它不能做操作,只作为一个标记而已,标记着容器结尾。
Example 1:
string name="Hello, iterator!"; for(string::iterator it=name.begin();it!=name.end();++it) { cout<<*it; }
Run:
Hello, iterator!
Example 2:
vector<int> year{2018,2017,2016,2015,2013,2012,2013}; for(auto it=year.begin();it!= year.end();++it ) { *it+=1; cout<<*it+1<<"\t"; }
Run:
2020 2019 2018 2017 2015 2014 2015
在示例2中:*it 的作用类似于指针中*p,叫做解引用迭代器,进而获取它所指向的元素。
数组
数组与vector类似,唯一不同的是,它的空间大小是固定的。也可以通过下标和范围for语句进行遍历。
const int N = 20; char ht[N]="hello, array!"; //特殊字符初始化,其字面量大小为13,存储在ht中大小为14,其中包含一个‘\0’,但是如果输出ht大小,其大小为20,因为在这之前我们已经定义它的大小为20,如果你输入20个字符,编译器不会通过,因为大小超出了,所以你只能输入19个。 for(auto i:ht) { cout<<i; }
Run:
hello, array!
多维数组
int array[2][3]={{1,2,3},{4,5,6}}; for(auto &i:array) for(auto j:i) cout<<j<<endl;
如果要对多维数组元素进行范围for语句处理,每一个控制元素都应该是引用类型,而当我们对多维数组元素进行范围for语句读操作时也是需要对控制元素进行引用,除了最里层的循环不需要设置控制变量为引用类型。
原因如下,当我们调用范围for循环时,外层for语句处理控制变量是会自动生成指针类型,而内层控制变量对于指针进行遍历,是不可取的。所以我们要对于外层控制变量定义为引用类型。
一步一步慢慢学,不怕学的比别人慢,就怕什么也没学懂。