我正在尝试实现一个允许我迭代对象STL样式而不明确地将它们存储在容器中的类。
一个简单的例子就是,类中的<Paragraph>::iterator
实际上没有Paragraphs的容器,而是有一个<string> text
变量。很容易创建一个实际逐行通过文本并组装段落的成员函数,但是对于我来说,将所有这些文本再次存储在某个容器中以便我可以继承它的迭代器似乎很愚蠢。
另外,我称之为<Paragraph>::iterator
而不是<string>::iterator
的原因是因为我可能想要一个不同类型的迭代器。例如,我可以计算每个段落中的字符数,并且<int>::iterator
。
我想我的问题是:在没有容器的情况下考虑迭代器是否恰当?
由于
答案 0 :(得分:6)
在没有容器的情况下考虑迭代器是否合适呢?
这不仅是恰当的,而是优越的思维方式:类应该具有精益接口 - 也就是说,它们应该只暴露他们需要暴露的东西,仅此而已。如何在内部处理段落(无论是将它们存储在容器中,如果存储在哪个容器中)都是实现细节,并且不属于类的接口。
在任何情况下,类都应该只显示段落的迭代器范围。一旦你在接口级别上摆脱了容器,就没有理由在课堂上有一个,正如你已经注意到的那样。
答案 1 :(得分:4)
是的,迭代器概念完全独立于容器的概念。
标准库有一组流迭代器,例如。任何可以迭代的东西都应该由C ++中的迭代器表示,无论是否存在底层的内存容器。
答案 2 :(得分:1)
Boost.Range面向这个概念。
答案 3 :(得分:0)
听起来像是在将Paragraph
对象视为paragrahs的容器。但是Paragraph
不能成为Paragraph
s容器的一部分吗?每个Paragraph
是一个单词的容器(或一个字符串,根据您的需要)?所以你可以在std::string
对象中使用Paragraph
迭代器,并使用std容器来保存Paragraph
?
您仍然可以创建一个自定义迭代器来迭代您想要的任何内容,无论您想要什么,the answer to this question都可以很好地概述如何构造迭代器类。