我有一个类TContainer,它是指向TITems类的几个stl集合指针的集合。
我需要创建一个Iterator来遍历TContainer类中所有集合中的元素,从而抽象客户端的内部工作。
做这件事的好方法是什么?我应该创建一个扩展迭代器的类吗(如果是这样,我应该扩展哪个迭代器类),我应该创建一个迭代器集合的迭代器类吗?
我只需要一个FORWARD_ONLY迭代器。
例如,如果这是我的集装箱:
typedef std::vector <TItem*> ItemVector;
class TContainer {
std::vector <ItemVector *> m_Items;
};
什么是好的迭代器来遍历m_Items成员变量的向量中包含的所有项?
7条答案
按热度按时间5vf7fwbs1#
当我创建自己的迭代器时(不久前),我继承了std::iterator,并将类型指定为第一个模板参数,希望能有所帮助。
对于前向迭代器,在下面的代码中使用forward_iterator_tag而不是input_iterator_tag。
这个类最初取自istream_iterator类(为了我自己的使用而进行了修改,因此它可能不再类似于istram_iterator)。
查看有关迭代器标记的文档:
http://www.sgi.com/tech/stl/iterator_tags.html
我们刚刚重读了迭代器的相关信息:
http://www.sgi.com/tech/stl/iterator_traits.html
这是一种老方法(iterator_tags),更现代的方法是为迭代器设置iterator_traits〈〉,使其完全兼容STL。
neekobn82#
如果您可以访问Boost,那么使用
iterator_facade
是最健壮的解决方案,而且使用起来非常简单。nxowjjhe3#
首先,让我们概括一下:
现在迭代器:
这个类假设外部迭代器包含指向内部范围的指针,这在你的问题中是必需的,这反映在
update
成员中,在begin()
和end()
之前的箭头中。如果你想在更常见的情况下使用这个类,即外部迭代器包含内部范围的值,你可以用点代替这些箭头。注意顺便说一句,这个类对于内部范围包含指针的事实是不可知的,只有类的客户端需要知道这一点。如果我们使用
boost::iterator_facade
,代码可能会更短,但是对于如此简单的东西,没有必要添加boost依赖项。此外,唯一棘手的部分是等式和增量操作,无论如何我们都要编写这些操作。我把下面的样板成员留给了"读者练习":
另一个有趣的练习是把它变成一个可以处理任意容器的模板,代码基本上是一样的,除了你必须在几个地方添加
typename
注解。使用示例:
其中打印:
0 1 2
uurity8g4#
迭代器只是一个支持特定接口的类。至少,你希望能够:
一旦你有了一个类,它可以合理地为你的集合做这件事,你将需要修改集合,使其具有返回迭代器的函数。
vuv7lop35#
检查Views Template Library。
特别检查
6qqygrtg6#
这是我所能生成的最简单的代码(对于自定义迭代器),注意我才刚刚开始探索这一领域,它调用内置的
upper_bound
函数来对整数函数执行二进制搜索,x^2
就是一个例子。这是输出的样子:
swvgeqrz7#
除了建议使用Boost.iterator的
iterator_facade
来实现自定义迭代器之外,我还编写了一个独立的、仅包含头部的库,它模拟了Boost.iterator提供的(重要的)部分,好处是没有Boost依赖(除了C++17之外,也没有任何其他依赖)。我的库的一个显著特点是,通过使用它,你的迭代器将始终遵循标准对迭代器接口的要求**,而不是更多的**。这确保了下游用户不会依赖于当前迭代器实现的实现细节(将来可能会删除/更改)。这将有助于提高可移植性和可维护性。
您可以在https://github.com/Krzmbrzl/iterators中找到该库。
下面是一个如何用这个库创建自定义迭代器的例子: