创建我自己的迭代器

How*_*May 141 c++ iterator

我正在努力学习C++,请原谅我,如果这个问题表明缺乏基础知识,你看,事实是,我缺乏基础知识.

我想要一些帮助来解决如何为我创建的类创建迭代器.

我有一个'Shape'类,它有一个容器点.我有一个类'Piece'引用一个Shape并定义Shape的位置.Piece没有Shape它只是引用一个Shape.

我希望它看起来像是一个Points的容器,它与它引用的Shape相同,但是添加了Piece的位置的偏移量.

我希望能够遍历Piece的点,就像Piece本身就是一个容器一样.我已经做了一点阅读,但没有找到任何帮助我的东西.我会非常感谢任何指针.

Kon*_*lph 62

/编辑:我明白了,这里实际需要一个自己的迭代器(我先读错了这个问题).尽管如此,我仍然让下面的代码成立,因为它在类似情况下很有用.


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

// 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(); }
}
Run Code Online (Sandbox Code Playgroud)

这假设你在vector内部使用,但类型可以很容易地适应.

  • 原始问题实际上确实说片段容器的迭代器应该在返回时修改值.这需要一个单独的迭代器,尽管它应该是继承的,或者主要来自原始的. (2认同)
  • 几年后,这仍然是谷歌上的顶级结果之一......现在可以通过执行以下操作来概括这一点: `auto begin() -&gt; decltype(m_shape.container.begin()) { return m_shape.容器.begin(); }` (2认同)

Roe*_*oel 40

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

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

  • 只是一个小小的评论:这本书讲的是C++标准库,而不是STL - 这些是不同的,但是很多人感到困惑(我也感到内疚) (3认同)

Abh*_*hay 20

在这里设计一个像Custom Container这样的STL是一篇很好的文章,它解释了如何设计类似容器类的STL以及它的迭代器类的一些基本概念.反向迭代器(稍微强硬一点)虽然留作练习:-)

HTH,


gbj*_*anb 15

你可以阅读这篇ddj文章

基本上,继承自std :: iterator以完成大部分工作.

  • 注意,`std :: iterator`从C ++ 17标记为[不建议使用](https://en.cppreference.com/w/cpp/iterator/iterator)。 (2认同)