关于迭代器
为什么要使用迭代器:
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 或未初始化的指针指向的地方类似。
待完善。。。