【问题标题】:c++ class with an iterator but no container带有迭代器但没有容器的 c++ 类
【发布时间】:2011-09-14 10:55:45
【问题描述】:

我正在尝试实现一个类,该类允许我迭代对象 STL 样式,而无需将它们显式存储在容器中。

一个简化的例子是,一个类中的<Paragraph>::iterator 实际上没有段落容器,而是有一个<string> text 变量。创建一个实际上逐行遍历文本并组合段落的成员函数很容易,但对我来说将所有这些文本再次存储在某个容器中似乎很愚蠢,以便我可以从它的迭代器中继承。

另外,我之所以称它为<Paragraph>::iterator 而不是<string>::iterator,是因为我可能想要一个不同类型的迭代器。例如,我可以计算每个段落中的字符数并得到<int>::iterator

我想我的问题是:在没有容器的情况下考虑迭代器是否合适?

谢谢

【问题讨论】:

    标签: stl iterator containers


    【解决方案1】:

    Boost.Range 就是围绕这个概念而设计的。

    http://www.boost.org/doc/libs/release/libs/range/index.html

    【讨论】:

      【解决方案2】:

      在没有容器的情况下考虑迭代器是否合适?

      这不仅是合适的,而且是优越的思维方式:类应该有精简的接口——也就是说,它们应该只公开它们需要公开的东西,仅此而已.如何在内部处理段落(是否将它们存储在容器中,如果存储在哪个容器中)是一个实现细节,不属于类的接口。

      在任何情况下,该类都应该只公开段落的迭代器范围。一旦你在接口级别摆脱了容器,可能就没有理由在类中拥有一个容器,正如你自己所注意到的那样。

      【讨论】:

        【解决方案3】:

        在我看来,您将 Paragraph 对象视为段落容器。但是Paragraph 不是Paragraphs 容器的一部分吗?每个Paragraph 是一个单词容器(或一个字符串,取决于您的需要)?所以您可以在Paragraph 对象中使用std::string 迭代器,并使用一个std 容器来保存Paragraph

        你仍然可以创建一个自定义迭代器来迭代你想要的任何东西,但是你想要,the answer to this question 很好地概述了如何构造你的迭代器类。

        【讨论】:

          【解决方案4】:

          是的,迭代器的概念完全独立于容器的概念。

          例如,标准库有一组流迭代器。任何可以迭代的东西都应该用 C++ 中的迭代器来表示,无论是否存在底层内存容器。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-02-26
            • 2014-01-18
            • 1970-01-01
            • 1970-01-01
            • 2020-06-09
            • 1970-01-01
            • 2015-03-11
            • 1970-01-01
            相关资源
            最近更新 更多