当前位置:  开发笔记 > 编程语言 > 正文

创建我自己的迭代器

如何解决《创建我自己的迭代器》经验,为你挑选了4个好方法。

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

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

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

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

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



1> Konrad Rudol..:

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


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

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

public:

    typedef std::vector::iterator iterator;
    typedef std::vector::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(); }
}

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


原始问题实际上确实说片段容器的迭代器应该在返回时修改值.这需要一个单独的迭代器,尽管它应该是继承的,或者主要来自原始的.

2> Roel..:

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

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


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

3> Abhay..:

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

HTH,



4> gbjbaanb..:

你可以阅读这篇ddj文章

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


注意,`std :: iterator`从C ++ 17标记为[不建议使用](https://en.cppreference.com/w/cpp/iterator/iterator)。
推荐阅读
依然-狠幸福
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有