c++ - 用 C++ 编写我自己的类似 STL 的迭代器的实现

标签 c++ design-patterns iterator

我目前正在尝试了解各种语言中迭代器的内在特性,即它们的实现方式。

比如下面这个类暴露了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/

相关文章:

c# - C#中涉及引用时的序列化与反序列化

c++ - 使用 vector<>::push_back() 时如何使用 vector 迭代器

c++ - 用子类定义类数组

c++ - 下一个排列定义

oop - 这个类+构造函数定义模式是否过于冗余?

c++ - 删除一个外部迭代器

c++ - C 数组的反向迭代器

c++ - win32 : how stop ReadFile (stdin|pipe)

c++ - divide and conquer & fork and join的区别

python - 正确使用 super() 到 .pop() 从每个子实例的父类列表中删除名称