迭代器Iterator,它是指针的泛化形式,每种迭代器只能用于它自己的容器类。
一般的迭代器都拥有以下的操作符:
(1)前递增和后递增操作符++,将迭代器跳到下一个数据项;
(2)前递减和后递减操作符–,将迭代器跳到上一个数据项;
(3)相等操作符==和不相等操作符!=,测试两个迭代器是否指向同一个位置;
(4)提领操作符*,加入P是迭代器变量,使用*p就能访问位于p处的数据,有些容器既可读又可写,有些只能读。
许多容器类都提供了以下的成员函数来返回迭代器对象,只想数据结构中的特殊数据元素:
• c.begin():返回容器c的迭代器,它指向容器c的第一个数据项;
• c.end():返回某个东西来测试迭代器在什么时候越过容器c的最后一个数据项,即end()返回值标志的是容器最后一个元素之后的位置,相当于一个哨兵值。
使用方法:for(p=c.begin();p!=c.end();p++)
例如使用vector的迭代器例子为:
#include <iostream>
#include <vector> //引用vector的头文件
using namespace std;
int main()
{
//定义一个vector容器
vector<int> container;
for(int i=1;i<=4;i++){
container.push_back(i); //存入数据
}
cout<<"Here is what id in the container:\n";
//定义一个迭代器
vector<int>::iterator p;
//遍历vector
for(p=container.begin();p!=container.end();p++){
cout<<*p<<" ";
}
cout<<endl;
//使用*p将数据全部置为0
cout<<"Setting entries to 0:\n";
for(p=container.begin();p!=container.end();p++){
*p=0;
}
cout<<"Now container contains:\n";
for(p=container.begin();p!=container.end();p++){
cout<<*p<<" ";
}
cout<<endl;
return 0;
}
可以使用==或是!=来判断两个迭代器是否定位到同一个元素;
下面用一个例子来看一下vector的迭代器是如何使用操作运算符的:
vector<char> container1;
container1.push_back('A');
container1.push_back('B');
container1.push_back('C');
container1.push_back('D');
for(int i=0;i<4;i++){
cout<<"container1["<<i<<"] =="
<<container1[i]<<endl;
}
cout<<endl;
//定义一个迭代器指向向量第一个元素的位置
vector<char>::iterator p1=container1.begin();
//随机访问
cout<<"The third entry is "<<container1[2]<<endl; //括号表示法
//以下两个类似,他们都不会改变p中的迭代器的值
cout<<"The third entry is "<<p1[2]<<endl;
cout<<"The third entry is "<<*(p1+2)<<endl;
cout<<"which has value of container1[0]"<<" "<<*p1<<endl;
cout<<"Two steps forward and one step back:"<<endl;
p1++;
cout<<*p1<<endl;
p1++;
cout<<*p1<<endl;
p1--;
cout<<*p1<<endl;
根据运算符我们可以将迭代器分为:
- 正向迭代器:++
- 双向迭代器:++、–
- 随机访问迭代器:++、–、随机访问
其中以上的又可以各自分为常量和可变两种,常量迭代器使用const_iterator
修饰,例如:"vector<int>::const_itertaor p;"
,它不允许更改迭代器指向的元素。
此外还有一种逆向迭代器reverse_iterator
,可以逆序遍历:
vector<int>::reverse_iterator rp;
for(rp=container.rbegin();rp!=container.rend();rp--){
cout<<*rp<<endl;
}
常量版本为const_reverse_iterator
;
当我们编程如下代码时(vector中有ABCD四个元素):
vector<char>::iterator p2;
for(p2=container1.begin();p2!=container1.end();p2++){
cout<<*p2<<" ";
}
vector<char>::reverse_iterator rp;
for(rp=container1.rbegin();rp!=container1.rend();rp++){
cout<<*rp<<" ";
}
cout<<endl;
输出:
/*
A B C D
D C B A
*/
此外还有很多种其他的迭代器,比如输入迭代器、输出迭代器等。
有关迭代器的参考资料可见:
Iterator-C++ Reference
Iterator library-cppreference