关于迭代器

为什么要使用迭代器:
1.可以不了解集合内部的数据结构,就可以直接遍历 2.不暴露内部的数据,可以直接外部遍历,提高安全性 3.适用性强,基本上的集合都能使用迭代器

Java中的迭代器

Java Iterator(迭代器)不是一个集合,它是一种用于访问集合的方法。

迭代器(it)的基本操作是 next 、hasNext 和 remove。

调用 it.next() 会返回迭代器的下一个元素,并且更新迭代器的状态。

调用 it.hasNext() 用于检测集合中是否还有元素。

调用 it.remove() 将迭代器返回的元素删除。

Iterator 类位于 java.util 包中,使用前需要引入它,语法格式如下:

import java.util.Iterator; // 引入 Iterator 类

模板类迭代器:

import java.util.Iterator;
public class ClassName<T> implements Iterable<T>{
... ...
... ...
 public Iterator<T> iterator()
    { return new ClassName(); }
 private class ClassName implements Iterator<T>
    {
        private int i;
        public boolean hasNext() {  }
        public T next() {  }
        public void remove() {  }
    }
}

 使用例子:

import java.util.Iterator;

public class Stack<Item> implements Iterable<Item>{
    private Node first;
    private int N;

    public class Node{
        Item item;
        Node next;
    }

    public boolean isEmpty() { return first==null; } //or return N==0

    public int size() { return N; }

    public void push(Item item) {
        Node oldFirst = first;
        first = new Node();
        first.item = item;
        first.next = oldFirst;
        N++;
    }

    public Item pop(){
        Item item = first.item;
        first = first.next;
        N--;
        return item;
    }

    public Iterator<Item> iterator(){
        return new ListIterator();
    }
    private class ListIterator implements Iterator<Item>{
        private Node current = first;

        public boolean hasNext(){
            return current != null;
        }
        public Item next() {
            Item item = current.item;
            current = current.next;
            return item;
        }
    }
}

 

C++中的迭代器

顺序容器和关联容器中的元素,需要通过“迭代器(iterator)”进行。迭代器是一个变量,相当于容器和操纵容器的算法之间的中介。迭代器可以指向容器中的某个元素,通过迭代器就可以读写它指向的元素。

迭代器按照定义方式分成以下四种。

1) 正向迭代器,定义方法如下:

容器类名::iterator  迭代器名;


2) 常量正向迭代器,定义方法如下:

容器类名::const_iterator  迭代器名;


3) 反向迭代器,定义方法如下:

容器类名::reverse_iterator  迭代器名;


4) 常量反向迭代器,定义方法如下:

容器类名::const_reverse_iterator  迭代器名;

使用例子:

#include <iostream>
#include <vector>
using namespace std;
int main()
{
    vector<int> v;  //v是存放int类型变量的可变长数组,开始时没有元素

    for (int n = 0; n<5; ++n)
        v.push_back(n);  //push_back成员函数在vector容器尾部添加一个元素

    vector<int>::iterator i;  //定义正向迭代器
    for (i = v.begin(); i != v.end(); ++i) {  //用迭代器遍历容器
        cout << *i << " ";  //*i 就是迭代器i指向的元素
        *i *= 2;  //每个元素变为原来的2倍
    }

    cout << endl;

    //用反向迭代器遍历容器
    for (vector<int>::reverse_iterator j = v.rbegin(); j != v.rend(); ++j)
        cout << *j << " ";

    return 0;
}

如果迭代器指向了容器中最后一个元素的后面或第一个元素的前面,再通过该迭代器访问元素,就有可能导致程序崩溃,这和访问 NULL 或未初始化的指针指向的地方类似。

待完善。。。

posted @ 2021-07-29 10:44  Hao_ran  阅读(56)  评论(0编辑  收藏  举报