iterator对比

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>

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值