迭代器就像用于访问集合元素的指针一样。
<ContainerType> ::iterator; <ContainerType> ::const_iterator;
迭代器可以是智能指针,它可以迭代复杂的数据结构。集合提供其迭代器类型。因此,可以说迭代器具有不同集合类型的公共接口。
集合类提供了两个基本的成员函数,它们允许迭代或遍历集合的元素:
让我们看一个简单的示例:
#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<<'\n'; for(itr=v.begin();itr!=v.end();itr++) //使用迭代器进行遍历。 { cout<<*itr<<" "; } v.push_back(10); cout<<'\n'; for(int i=0;i<6;i++) { cout<<v[i]<<" "; } cout<<'\n'; 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
在上面的示例中,我们观察到,如果不使用迭代器遍历向量的元素,则需要跟踪集合中添加的元素数量。
让我们看一个简单的示例:
#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'步骤。
祝学习愉快!(内容编辑有误?请选中要编辑内容 -> 右键 -> 修改 -> 提交!)