【问题标题】:Generic iterator泛型迭代器
【发布时间】:2010-09-05 19:31:32
【问题描述】:

我正在尝试找到一种访问一组容器的通用方法。除了另一个自定义列表之外,我还有一个标准向量和列表。

自定义列表定义了一个迭代器;

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;
};

但显然这些都是不同类型的迭代器。不过,我可以假设所有容器都是同一类型。

有没有优雅的方法来解决这个问题?

【问题讨论】:

    标签: c++ generics iteration containers


    【解决方案1】:

    【讨论】:

    【解决方案2】:

    迟到总比没有好...

    最新一期的C-Vu 出现了,猜猜里面有什么:没错,迭代器完全按照你的意愿行事。

    很遗憾,您需要成为ACCU 的成员才能查看该杂志(该文章引用了 David 链接到的 2000 年的 Overload 文章)。但是,以每年微不足道的价格,您可以获得一本不错的杂志、会议和用户组。成为会员后,您可以查看 PDF 的过刊,what are you waiting for?

    【讨论】:

    • 如果您提到这篇文章将在 20 年 6 月 3 日第 20 卷中找到,标题为 C++ 中的自定义迭代器,那将会很有帮助。顺便说一句,用户图片不错。
    【解决方案3】:

    小心你的要求。您看到的 any_iterator 类适用于无限的迭代器类型集。你只有三个,你事先知道。当然,您将来可能需要添加第四种类型,但是如果这需要 O(1) 额外的代码行怎么办?

    封闭的可能包含类型集的最大优点是您在 sizeof() 上有一个上限,这意味着您可以避免堆和它带来的间接性。基本上,将它们全部放入 boost::variant 并调用 apply_visitor。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-09
      • 1970-01-01
      • 2013-09-11
      • 2012-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多