C++是令人着迷的一门编程语言,容器和迭代器是是C++的重要组分。容器和迭代器算是比较容易理解,容器是静态的,是负责存储数据的,比如数组,链表,二叉树等,迭代器是和容器密切相关的,是针对特定容器设计出来的数据访问器。二者紧密相连,为算法等构建提供基础设施建设。下面就从源码实现角度,详细解析容器和迭代器的关系,分析对象为STL中的deque(双端队列)。
从源码角度考察容器和迭代器之间的关系。
容器源码:
template<class T,class Alloc=alloc,size_t BufSize=0>
class deque{
public:
.....
protected:
iterator start;
iterator finish;
public:
iterator begin(){return start;}
iterator end(){return finish;}
}
迭代器源码:
template<class T,class Ref,class Ptr,size_t BufSiz>
struct __deque_iterator
{
T *cur;
T *first;
T *last;
}
首先要明白的一点是提供容器的同时必须要提供迭代器。看一下二者的“相互渗入”吧,首先对于容器来说,会提供两个迭代器(也可以认为是两个指针)分别指向容器的头和尾。
迭代器的结构中,会有三个容器所容数据类型的指针,cur、first以及last,这三个指针将来是要深入容器中数据结构内部的。好了,二者的结合点,可以用这样理解:容器和迭代器两人对彼此都很了解,因为出自同一人之手,容器为迭代器提供了一个头尾指针,迭代器内相应的指针,能够在容器中自由游走。下面先看看,迭代器是怎样在容器中自由游走的。