gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 23:13:25 25 4
gpt4 key购买 nike

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

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com