范围for遍历Vector 入门iterator

Vector

​ 用范围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语句处理控制变量是会自动生成指针类型,而内层控制变量对于指针进行遍历,是不可取的。所以我们要对于外层控制变量定义为引用类型。


一步一步慢慢学,不怕学的比别人慢,就怕什么也没学懂。

----至自己

猜你喜欢

转载自blog.csdn.net/arctic_fox_cn/article/details/80293444
今日推荐