迭代器就像用于访问集合元素的指针一样。
- 迭代器用于从一个元素遍历到另一个元素,这一过程称为迭代集合。
- 迭代器的主要优点是为所有集合类型提供通用接口。
- 迭代器使算法独立于所使用的集合类型。
- 迭代器提供了一种浏览集合元素的通用方法。
迭代器语法
<ContainerType> ::iterator; <ContainerType> ::const_iterator;
迭代器操作
- Operator(*) - " *"运算符返回迭代器指向的当前位置的元素。
- Operator(++) - " ++"运算符将迭代器加1。因此,迭代器指向集合的下一个元素。
- Operator(==)和Operator(!=) - 这两个运算符都确定两个迭代器是否指向同一位置。
- Operator(=) - "="运算符分配迭代器。
迭代器和指针
迭代器可以是智能指针,它可以迭代复杂的数据结构。集合提供其迭代器类型。因此,可以说迭代器具有不同集合类型的公共接口。
集合类提供了两个基本的成员函数,它们允许迭代或遍历集合的元素:
- begin() - begin()函数返回指向集合第一个元素的迭代器。
- end() - end()函数返回一个迭代器,该迭代器指向集合的过去-最后一个元素。

让我们看一个简单的示例:
#include <iostream> #include<iterator> #include<vector> using namespace std; int main() { std::vector<int> v{1,2,3,4,5}; vector<int>::iterator itr; for(itr=v.begin();itr!=v.end();itr++) { std::cout << *itr <<" "; } return 0; }
输出:
1 2 3 4 5
迭代器类别
迭代器可以通过以下方式进行分类:
- 输入迭代器
- 输出迭代器
- 转发迭代器
- 双向迭代器
- 随机访问迭代器

输入迭代器:输入迭代器是用于从集合访问元素的迭代器,但它不会修改集合的值。
用于输入迭代器的运算符是:
- 增量运算符(++)
- 等于运算符(==)
- 不等于运算符(!=)
- 取消引用运算符(*)
输出迭代器:输出迭代器是用于修改集合值的迭代器,但不会从集合中读取值。因此,我们可以说输出迭代器是只写迭代器。
用于输出迭代器的运算符是:
- 增量运算符(++)
- 赋值运算符(=)
Forward Iterator :Forward Iterator是用于读取和写入集合的迭代器。这是一个多遍迭代器。
用于正向迭代器的运算符是:
- 增量运算符(++)
- 赋值运算符(=)
- 相等运算符(=)
- 不相等运算符(!=)
双向迭代器:双向迭代器是一种支持正向迭代器所有函数的迭代器,另外还增加了一个函数,即减量运算符(-)。我们可以通过减少迭代器来向后移动。
用于双向迭代器的运算符是:
- 增量运算符(++)
- 赋值运算符(=)
- 相等运算符(=)
- 不相等运算符(!=)
- 递减运算符(--)
随机访问迭代器:随机访问迭代器是一种迭代器,可在任意位置对元素进行随机访问。它具有双向迭代器的所有函数,另外还增加了一个函数,即指针添加和指针减法以提供对元素的随机访问。
让我们看一个简单的示例:
#include <iostream> #include<vector> #include<iterator> using namespace std; int main() { vector<int> v{1,2,3,4,5}; vector<int>::iterator itr; for(int i=0;i<5;i++) //不使用迭代器的遍历。 { cout<<v[i]<<" "; } cout<< ; for(itr=v.begin();itr!=v.end();itr++) //使用迭代器进行遍历。 { cout<<*itr<<" "; } v.push_back(10); cout<< ; for(int i=0;i<6;i++) { cout<<v[i]<<" "; } cout<< ; for(itr=v.begin();itr!=v.end();itr++) { cout<<*itr<<" "; } return 0; }
输出:
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5 10
1 2 3 4 5 10
在上面的示例中,我们观察到,如果不使用迭代器遍历向量的元素,则需要跟踪集合中添加的元素数量。
- 代码可重用性:如果我们使用迭代器,则可以重用代码。在上面的示例中,如果我们用列表替换vector,则下标operator []将无法访问元素,因为列表不支持随机访问。但是,我们使用迭代器访问元素,然后也可以访问列表元素。
- 动态处理:C++迭代器提供了动态添加或删除数据的函数。
让我们看一个简单的示例:
#include <iostream> #include<vector> #include<iterator> using namespace std; int main() { vector<int> v{1,2,3,4,5}; //向量声明 vector<int>::iterator itr; v.insert(v.begin()+1,10); for(itr=v.begin();itr!=v.end();itr++) { cout<<*itr<<" "; } return 0; }
输出:
1 10 2 3 4 5
在上面的示例中,我们使用insert()函数在第二个位置插入了一个新元素,所有其他元素都移位了一个。
其他迭代器
随机访问迭代器与其他迭代器之间最重要的区别在于,随机访问迭代器需要1步骤来访问元素,而其他迭代器则需要n步骤。