Why Iterator 为什么要用迭代器

为什么要用迭代器,这个问题常常伴随着“有指针还不够吗”。
是的,不够,因为指针作为内置数据类型,已经把功能限定好了,你没法让++和--的功能互换。 而迭代器可以。

当我们看到下面的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <vector>
using namespace std;

int main(){
vector<int> vec = {1,2,3,4,5};
vector<int>::iterator it = vec.begin();
it++;
cout<< *it<<endl;
it += 2;
cout<< *it<<endl;
it-- ;
cout<< *it<<endl;
it -= 2 ;
vector<int>::iterator it_new = vec.begin();
if(it==it_new)
cout<< "it equal to it_new"<<endl;
}
//输出如下
2
4
3
it equal to it_new

可能会认为vector::iterator it就是指针,因为它能执行++, --, += , -= , * , == 等操作,跟指针一样。但实际上并非如此。

1)我这样理解指针:指针是C/C++内置定义的数据类型模板,能执行 ++, --, += , -= , , == 等运算符。
2)我这样理解迭代器:迭代器是标准库或者用户定义的,且不一定重载了以上所有的运算符。但是++一般是有的,否则就失去了“迭代”的意义
3)我这样理解vector迭代器:STL库中vector的编写者,为vector的iterator迭代器仿照指针重载了++, --, += , -= ,
, == 等指针常用的运算符,使它特别像指针。

根据使用场景不同,可以定义不同的迭代器,vector可不止定义了iterator一种迭代器,还有const_iterator , reverse_iterator , const_reverse_iterator
我们看看reverse_iterator的场景:

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
#include <vector>
using namespace std;
int main(){
vector<int> vec = {1,2,3,4,5};
vector<int>::reverse_iterator it = vec.rbegin();
cout << *it << endl;
it++;
cout << *it << endl;
}
//输出如下
5
4

可以见reverse_iterator作为反向迭代器,把++操作重载成了反向的。但你不能说这是反向指针。

以上。