【问题标题】:How is the syntax for stl iterators implemented?stl 迭代器的语法是如何实现的?
【发布时间】:2011-02-26 01:20:04
【问题描述】:

我一直在业余时间编写一个库,以使自己更加熟悉 C++ 和奇异值分解。我一直在编写一个 Iterator 类,我完全有能力编写功能,而且我已经为我自己的当前 MatrixIterator 类编写了。我猜它涉及命名空间,因为:

vector<int>::iterator

似乎是命名空间向量的迭代器,但命名空间是我不熟悉的另一个主题。

我主要是在问实现一个迭代器会涉及什么,以便它可以以与 stl 迭代器类似的方式被引用。我也知道我可以使用 boost.iterators 或类似的东西来为自己节省大量工作,但我更感兴趣的是了解涉及此类内容的所有细节。

【问题讨论】:

    标签: c++ stl iterator


    【解决方案1】:

    vector&lt;int&gt; 是 class 而不是 namespace(重要区别),定义大致如下:

    template<typename T>
    class vector{
        public:
            typedef some_type iterator;
        ...
    };
    

    其中some_type 也很可能是向量的friend,甚至是成员类

    【讨论】:

      【解决方案2】:

      :: 运算符不仅访问命名空间;它还访问类的类型定义、静态成员、枚举等。

      #include <iostream>
      
      template <typename T>
      class Foo
      {
          public:
              static void write(T t)
              {
                  std::cout << t << std::endl;
              }
      
              typedef T thing;
      };
      
      int main()
      {
          Foo<int>::thing my_thing = 42;
          Foo<int>::write(my_thing);
      }
      

      【讨论】:

        【解决方案3】:

        不,这与命名空间无关。它只是一个类中的 typedef:

        template <typename T>
        class container
        {
        public:
            typedef ... iterator;
        };
        

        一旦有了迭代器类,就需要实现几个运算符。对于前向迭代器,这将是:

        operator*();
        operator++();
        operator==(const TYPE &other);
        

        如果您想要一个可以完全参与 STL 其余部分的迭代器,您还需要做其他事情,例如给它一个类别。

        【讨论】:

          【解决方案4】:

          通常它是容器内的嵌套类或通过 :: 访问的 typedef。

          网络上有大量带有迭代器的类示例(我不建议研究 STL 实现,因为如果您是第一次看的话很难理解)。

          您可以查看 STX Btree 实现以查看设计良好的迭代器示例。

          【讨论】:

            猜你喜欢
            • 2014-05-23
            • 1970-01-01
            • 1970-01-01
            • 2011-01-22
            • 2022-01-06
            • 2015-01-20
            • 2010-10-25
            相关资源
            最近更新 更多