为什么要用迭代器,这个问题常常伴随着“有指针还不够吗”。
是的,不够,因为指针作为内置数据类型,已经把功能限定好了,你没法让++和--的功能互换。 而迭代器可以。
当我们看到下面的代码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
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作为反向迭代器,把++操作重载成了反向的。但你不能说这是反向指针。
以上。