在数组vector 中,我们使用了下标遍历容器数组的每一个元素。
例如:
vector<int> v(10);//创建10个值为0的元素
for (size_t i = 0; i < v.size(); ++i)
{
cout << v[i] << " ";
}
什么是迭代器?
迭代器是专门用来遍历容器的对象(是容器类的内部类型)。
有了迭代器,我们可以像下面这样实现上面的代码:
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> v{1,2,3,4,5,6,7,8,9};//初始化9个元素
for (auto itr = v.begin(); itr != v.end(); ++itr)
{
cout << *itr << " ";
}
return 0;
}
程序输出:
更具体的介绍请看下文。
迭代器类型
假设v是一个容器,比如 vector<int> v;
v的迭代器的类型为:vector<int>::iterator
所以,定义一个迭代器变量的写法为:
vector<int>::iterator itr = v.begin()
而使用auto 就可以让代码大大简化:
auto itr = v.begin()
迭代器的能力
迭代器就是拥有下面的能力的对象:
v.begin() | 返回指向第一个元素的迭代器 | |
v.end() | 指向最后一个元素的下一个位置的迭代器 | 迭代器到达这里表示迭代结束,专门用来结束迭代 |
*itr | 解引用,获得所指向元素的引用 | |
++itr | 向后移动一次,指向下一个元素 |
创建迭代器变量:
迭代器自增操作
++itr表示迭代器自增操作,迭代器指向下一个元素
迭代器的解引用操作
解引用得到了变量本身,所以可以对变量进行读写。
上图中的 itr 可以像下面这样使用:
cout<<*itr;//输出33
*itr = 123;//修改变量arr[1]的值为123
下面我们就用迭代器来遍历数组,看看两者的相同与不同:
#include <iostream>
#include <vector>
using namespace std;
int main()
{
//定义一个数组,并放入一些整数
vector<int> a{ 0,1,2,3,4,5,6,7,8,9 };
//使用下标遍历数组输出其中的每一个元素
for (int i = 0; i < a.size(); ++i)
{
cout << a[i] << " ";
}
cout << endl;
//使用迭代器输出数组中的每一个元素
for (auto itr = a.begin(); itr != a.end(); ++itr)
{
cout << *itr << " ";//使用解引用操作符*获得迭代器迭代到的元素的引用
}
return 0;
}
输出如下:
迭代器遍历与下标遍历的对比
从上面的代码中,我们可以对比看看迭代器遍历数组和下标遍历数组的异同:
下标访问 | 迭代器访问 | |
---|---|---|
访问第N个元素的形式 | a[i] | *itr |
访问第1个元素的形式 | a[0] | *a.begin() |
访问最后一个元素的形式 | a[a.size()-1] | *(a.begin()+a.size()-1) |
循环结束的条件 | i < a.size() | itr != a.end() |
移下一个元素 | ++i | ++itr |