创建我自己的迭代器

时间:2020-03-06 14:52:21  来源:igfitidea点击:

我正在尝试学习C ++,所以如果这个问题表明我们缺乏基础知识,请原谅我,事实是,我缺乏基础知识。

我需要一些帮助,以解决如何为自己创建的类创建迭代器的问题。

我有一个"形状"类,其中包含点容器。
我有一个" Piece"类,该类引用了Shape并定义了Shape的位置。
零件没有形状,它仅引用形状。

我希望它看起来像Piece是一个点的容器,这些容器与它引用的Shape相同,但是增加了Piece位置的偏移量。

我希望能够遍历Piece的点,就好像Piece本身就是一个容器一样。我已经阅读了一番,没有发现任何对我有帮助的东西。我将不胜感激任何指针。

解决方案

/ EDIT:我知道,这里实际上需要一个自己的迭代器(我先错读了问题)。尽管如此,我还是保留下面的代码,因为它在类似情况下可能很有用。

这里实际上是否需要一个自己的迭代器?将所有必需的定义转发到保存实际点的容器也许就足够了:

// Your class `Piece`
class Piece {
private:
    Shape m_shape;

public:

    typedef std::vector<Point>::iterator iterator;
    typedef std::vector<Point>::const_iterator const_iterator;

    iterator begin() { return m_shape.container.begin(); }

    const_iterator begin() const { return m_shape.container.begin(); }

    iterator end() { return m_shape.container.end(); }

    const_iterator end() const { return m_shape.const_container.end(); }
}

这是假设我们在内部使用"向量",但是类型可以很容易地适应。

解决问题的方法不是创建自己的迭代器,而是使用现有的STL容器和迭代器。将每个形状中的点存储在类似矢量的容器中。

class Shape {
    private:
    vector <Point> points;

从那时起我们所做的工作取决于设计。最好的方法是迭代Shape内部方法中的点。

for (vector <Point>::iterator i = points.begin(); i != points.end(); ++i)
    /* ... */

如果需要访问Shape外部的点(这可能是设计不足的标志),则可以在Shape方法中创建,该方法将返回点的迭代器访问函数(在这种情况下,还为点容器创建公共typedef)。有关此方法的详细信息,请查看Konrad Rudolph的答案。

我们可以阅读此ddj文章

基本上,继承自std :: iterator可以为我们完成大部分工作。

我们应该使用Boost.Iterators。它包含许多模板和概念,用于为现有迭代器实现新的迭代器和适配器。我已经写了一篇关于这个话题的文章。刊登在2008年12月的ACCU杂志上。它讨论了一种针对问题的(IMO)优雅解决方案:使用Boost.Iterators从对象公开成员集合。

如果只想使用stl,则Josuttis书中有一章介绍了如何实现自己的STL迭代器。

在这里设计类似于Custom Container的STL是一篇很棒的文章,它解释了一些如何像容器类的STL及其迭代器类一起设计的基本概念。反向迭代器(难度较小)虽然作为练习而保留:-)

HTH,