概述
1. 指针应该被你重视
很多初学者学java,可能本着和我一样的目的:它是门更新潮的语言,写起来优美,没有指针... ...balabala。
iterator是个非常有意思的东西,但是引起众多java新手的困惑。归纳下其他博客的归纳:
iterator是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构。
(1) 使用方法iterator()要求容器返回一个Iterator。第一次调用Iterator的next()方法时,它返回序列的第一个元素。注意:iterator()方法是java.lang.Iterable接口,被Collection继承。
(2) 使用next()获得序列中的下一个元素。
(3) 使用hasNext()检查序列中是否还有元素。
(4) 使用remove()将迭代器新返回的元素删除。
所以得出一个结论,iterator是对象,哦,它只能指向序列中的对象。
然而你可能还在困惑中,因为java隐藏了指针概念。这点用C++解释最为清晰明了。其实呢,iterator就是STL库中的封装指针,一般C++程序员喜欢称它为泛型指针,因为它所指的可以是任意数据类型。那和一般指针有什么区别呢?我们先看普通指针,例如,p指针访问变量var,
int var =1024;
int* p = &var; //long *p = &var就是错误的
cout<<*p<<endl; //*p是普通指针
使用普通指针p2访问数组,
int var2[5]={1,2,3,5,7};
int* p2 = &var2;
for(int i=0; i<5; i++, p2++){
cout<<*p2<<" "<<endl;
}
我们发现声明普通指针都应该指明这个指针所指类型,例如上面提及的例子:long *p = &var就是错误的。
而对于不确定的数据类型,iterator满足了泛型需求,广泛用在C++的模板函数(可以理解为java的泛型方法)中:
template <typename elemType>
void display(const vector<elemType> &vec, ostream &os){
vector<elemType>::const_iterator it = vec.begin();
vector<elemType>::const_iterator it2 = vec.end();
for( ; it!=it2; it++){
os<<*it<<" "<<endl;
}
}
这里的elemType可以是任意类型的数据。需要注意的是vec.end()并不是指向vector的最后一个元素,而是最后一个元素的下个位置,通常这个位置都是0。和Java不同的是,java数组a[2]={1,2},如果取到a[2]会自动抛出数组越界异常,而C++照样可以取到a[2],只是这里的a[2]就可能是其他工程项目的数据了,既这里数组的1,也不是2。
2. Iterator只能指向容器
iterator除了泛型使用外,还有一个需要注意的是,iterator只能指向容器。什么是容器呢?你可以理解为java中的Collection。必须指出的是,C++的容器,java的Collection都是类!(List例外,它是接口,也可以视为抽象类)
C++的STL库规定了容器只有两类:
1)序列化容器(Sequential container):vector, list等
2)关联式容器(associative container):map, set等
序列化容器依次维护其中元素:第一个元素,第二个元素,... ...,这是iterator最主要的应用场合。
关联式容器则是为了快速寻找其中的值,例如map由key/value键值对表示。我们检索的是key,对应可以找到key下对应的value。
知道了这个以后,我们就知道除了容器以外的iterator场景都是错误的,例如,iterator遍历数组?不可能!!!
int a[3]={1,5,7};
int[] :: iterator it = a.begin() //错误,数组不是容器对象
vector<int> vec(a, a+3);
vector<int>::iterator it = vec.begin(); //正确
3. 引入STL库头文件
使用iterator,以及iterator的各种函数,例如find(), binary_search()等必须导入泛型算法库。这样才可以自由地使用iterator。
#include <algorithm>
最后
以上就是踏实老虎为你收集整理的iterator对比的全部内容,希望文章能够帮你解决iterator对比所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复