我目前正在尝试了解各种语言中迭代器的内在特性,即它们的实现方式。
比如下面这个类暴露了list接口(interface)。
template<class T>
class List
{
public:
virtual void Insert( int beforeIndex, const T item ) throw( ListException ) =0 ;
virtual void Append( const T item ) =0;
virtual T Get( int position ) const throw( ListException ) =0;
virtual int GetLength() const =0;
virtual void Remove( int position ) throw( ListException ) =0;
virtual ~List() =0 {};
};
根据GoF,实现可以支持不同类型遍历的迭代器的最佳方法是创建基Iterator 类(List 的 friend ),使用可以访问List 成员的 protected 方法。 Iterator 的具体实现将以不同的方式处理作业,并通过基本接口(interface)访问 List 的私有(private)和 protected 数据。
从这里开始,事情变得越来越困惑。比如说,我有类 LinkedList 和 ArrayList,都是从 List 派生的,还有对应的迭代器,每个类都返回。如何实现 LinkedListIterator?我完全没有想法。以及基础迭代器类可以从 List 中检索到什么样的数据(这只是一个接口(interface),而所有派生类的实现差异很大)?
最佳答案
STL 并没有真正使用抽象基类和虚函数。相反,它被有意设计为不是 OO(在 GoF 的意义上),并且完全基于模板构建,旨在实现“编译时多态性”。模板不关心抽象接口(interface)。只要它们具有足够相似的接口(interface),事情就可以工作(例如,如果您要调用 Append
push_back
代替,更多期望符合 STL 的容器的代码将为您工作,例如 std::back_insert_iterator
)。
一个符合 STL 的迭代器必须重载许多操作符以表现得像一个指针(尽可能地,考虑到容器的限制),包括 *
、->
、++
、--
(如果双向 - 双链接)、==
和 !=
。
关于c++ - 用 C++ 编写我自己的类似 STL 的迭代器的实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2656345/