为自定义数组实现迭代器

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为自定义数组实现迭代器相关的知识,希望对你有一定的参考价值。

我即将创建自己的可迭代通用Array实现。我创建了一个名为Iterable<E>的接口,它将“强制”所有的继承者实现其所有纯虚方法。界面有以下原型:

可迭代

public:
virtual Iterable<E>& operator=(const Iterable<E>& iter) = 0;
virtual bool operator==(const Iterable<E>& iter) const = 0;
virtual bool operator!=(const Iterable<E>& iter) const = 0;
virtual Iterable<E>& operator++() = 0;
virtual E& operator*() = 0;

在我的Array<E>中,我创建了以下方法:

Iterable<E> begin();
Iterable<E> end();

类qazxsw poi有qazxsw poi的匿名嵌套实现,它看起来如下:

ArrayIterator

Array<E>

然后我在Iterable<E>class ArrayIterator : public Iterable<E> { public: ArrayIterator(Array<E>* array, const int index) : _array(array), _index(index) {}; ArrayIterator& operator=(const ArrayIterator& iter) override { _index = iter._index; return *this; } bool operator==(const ArrayIterator& iter) const override { return _index == iter._index; } bool operator!=(const ArrayIterator& iter) const override { return _index != iter._index; } ArrayIterator& operator++() override { _index++; return *this; } E& operator*() override { return _array[_index]; } private: Array<E>* _array; int _index; }; 方法中返回ArrayIterator实例:

begin()

一切都编译得很好,但是当我尝试使用每个时,我会抛出一个编译时错误:'Iterable cannon instantiable abstract class'在下面的例子中:

end()

作为 Iterable<E> Array<E>::begin() { return ArrayIterator(this, 0); } Iterable<E> Array<E>::end() { return ArrayIterator(this, this->length()); //length() returns array size } 我已经返回int main() { Array<int> array{1, 2, 3, 4}; for(int i : array) { //<- error points to this line } } 这是它的实现,不应该通过多态?

答案

你的IterableArrayIterator函数都返回begin,而不是end。您创建的返回的Iterable<E>被切片,只返回创建的对象的基本部分。

由于这需要创建抽象类,因此会出现编译错误。

以上是关于为自定义数组实现迭代器的主要内容,如果未能解决你的问题,请参考以下文章

在OpenGL 4.5中迭代自定义结构unifrom数组

设计模式—迭代器Iterator模式

为自定义控件实现值访问器时,未从事件中的模型获取更新值

为自定义 C 库分发 CFFI 包装器

Java 经典实例:自定义迭代器

日常学习随笔-自定义了一个MyArrayListDefin集合(数组扩容+迭代器+JDK1.8新方法+详细说明)