通用迭代器
时间:2020-03-05 18:39:24 来源:igfitidea点击:
我试图找到一种访问一组容器的通用方法。除了另一个自定义列表之外,我还有一个标准矢量和列表。
定制列表定义了一个迭代器;
class Iterator: public std::iterator<std::forward_iterator_tag, T> { // ... } Iterator begin() { return (Iterator(root)); } Iterator end() { return (Iterator(NULL)); }
与适当的运算符重载。
理想情况下,我想这样做。
class Foo { public: Foo() { std::list<int> x; std::vector<int> y; custom_list<int> z; iter = x.begin(); // OR iter = y.begin(); // OR iter = z.begin(); // ... }; private: std::iterator<int> iter; };
但是显然这些都是不同类型的迭代器。我可以假设所有容器都是同一类型。
有解决这个问题的优雅方法吗?
解决方案
回答
这是我们可能会感兴趣的一些文章
为STL迭代器提供基类
C ++迭代器的类型清除
any_iterator类参考
回答
迟到总比不到好...
最新一期的C-Vu出现了,我们可以猜测其中的内容:没错,迭代器完全可以实现我们想要的功能。
不幸的是,我们需要成为ACCU的成员才能查看该杂志(本文引用了David链接的2000年以来的Overload文章)。但是,只需一年的可观价格,我们就可以读到一本不错的杂志,阅读会议和用户群。成为会员后,我们可以查看后刊的PDF,我们还在等什么?
回答
小心要求的情况。我们看到的any_iterator类适用于无限制的迭代器类型集。我们只有三个,这些是我们预先知道的。当然,我们将来可能需要添加第四种类型,但是如果这需要O(1)额外的代码行怎么办?
一组封闭的可能包含类型的最大优点是我们对sizeof()有一个上限,这意味着我们可以避免堆及其带来的间接调用。基本上,将它们全部塞入boost :: variant并调用apply_visitor。