16.7.2 带有迭代器的PStash
对于大多数容器类,有迭代器是有意义的。这里对PStash类添加一个迭代器:
这个文件的大部分是先前PStash和嵌套iterator直接翻译成的模板。然而,这时运算符返回对当前迭代器的引用,这是更典型和更灵活的方法。
析构函数对于所有被包含的指针调用delete,并且因为类型由模型获取,所以将发生适当的销毁。应当知道,如果容器存放指向基类类型的指针,那么这个类型应当有虚析构函数,以保证正确地清除派生对象,当将这些派生对象放进该容器时,它们的地址已经发生了向上类型转换。
PStash:iterator遵循迭代器在其生命期内只结合单个容器对象这一模式。另外,拷贝构造函数允许让新迭代器指向已存在迭代器指向的同一位置,这就像在容器内夹了书签。operator+=和operator-=成员函数允许移动迭代器一些距离,但与容器的边界有关。重载的增加和减小运算符移动迭代器一个位置。operator+生成新迭代器,它向前移动加数个位置。像前面的例子一样,指针反向引用运算符被用于在迭代器涉及的元素上进行运算,remove()通过调用容器的remove()来销毁当前对象。
就像前面的同样代码(按照标准C++库容器方式),被用来创建终止哨兵:第二构造函数、容器的end()成员函数和用于比较的operator==与operator!=。
下面的例子创建和测试两个不同种类的Stash对象:一个成为名为Int的新类,它宣布它的构造和析构;另一个存放标准库string类的对象。
为了方便,Int有一个相关的ostream operator<<,用于Int&和Int*。
在main()中的第一个代码段用花括号括起来,用来强迫PStash<Int>的销毁,并因而由析构函数自动清除。用手工移走和删除元素的范围,以表明PStash清除了剩余的元素。
对于PStash的这两个实例,创建一个迭代器并用于遍历容器。注意由使用这些构造函数所产生的简洁性,我们不会遭受使用数组的实现细节的困扰。只要告诉容器和迭代器对象做什么,而无需告诉它们如何做。这就使得这个解决方法容易概念化、建立和修改。