迭代器
STL(Standard Template Library)中提供了许多容器,包括vector、list、map、set等,少部分容器(vector)可以通过下标来访问其中的元素,而大部分的容器都不可以这么做,为了能够以一种统一的方式来访问STL的所有容器,STL提供了迭代器访问的方式,它的实现方式是在每个容器类中内嵌了一个专属的iterator类,在iterator类中实现了对该容器的元素的遍历和访问。
通过在所有容器类中实现iterator,就可以很方便地实现一些通用算法,比如find查找函数,前两个参数填起始和结束位置的迭代器,第三个参数填需要查找的值,就可以适用于各种容器(因为迭代器提供了统一的访问方式)。
在每个容器类中实现迭代器时,需要对一些基本操作如*、->、++、==、!=、=等进行重载,使其具有了遍历复杂数据结构的能力,其遍历机制取决于所遍历的容器,所有迭代器的使用和指针的使用非常相似(迭代器很好地诠释了接口与实现分离的意义)。通过begin,end函数获取容器的头部和尾部迭代器,end迭代器不包含在容器之内,当begin和end返回的迭代器相同时表示容器为空。
实现迭代器
这里以List为例子,展示了如何在容器中内嵌和实现list_iterator类。
my_list.h
#ifndef CPP_PRIMER_MY_LIST_H
#define CPP_PRIMER_MY_LIST_H
#include <iostream>
template<typename T>
class node {
public:
T value;
node *next;
node() : next(nullptr) {
}
node(T val, node *p = nullptr) : value(val), next(p) {
}
};
template<typename T>
class my_list {
private:
node<T> *head;
node<T> *tail;
int size;
private:
class list_iterator {
private:
node<T>