STL容器迭代器和C指针迭代器之间有什么区别

时间:2014-10-10 06:10:41

标签: c++ stl iterator containers

我正在编写一个反向迭代器作为我自己的自定义矢量类的一部分。到目前为止,我所写的内容如下:

class MyVector
{
  public:

  typedef T                           value_type;
  typedef value_type*                 pointer;
  typedef const value_type*           const_pointer;
  typedef value_type&                 reference;
  typedef const value_type&           const_reference;
  typedef pointer                     iterator;
  typedef const_pointer               const_iterator;
  typedef size_t                      size_type;

    class reverse_iterator
    {
        private:

        iterator iter;

        public:

        inline reverse_iterator(iterator a=0) : iter(a) {}
        inline reverse_iterator(const reverse_iterator& rev_iter) : iter(rev_iter.iter) {}
        inline reverse_iterator& operator++()
        {
            --iter;
            return *this;
        }
        // and remaining other operator functions
    };

  inline iterator begin (void) { return ((iterator)data_array);           }
  inline iterator end (void)   { return ((iterator)data_array+number_of_elements); }
  inline reverse_iterator      rbegin(void)    { return end()-1;}
  inline reverse_iterator      rend(void)      { return begin()-1;}


    //functions for myvector class 
}; //end of Myvector class
上面的类迭代器中的

只是C样式指针而reverse_iterator是类。所以当我做的时候

    main()
    {
        myVector<int> i;
        myVector<int>::reverse_iterator rit= i.begin();
    }

我的reverse_iterator初始化为 begin()函数,代码正在编译并运行。但是在STL的迭代器和reverse_iterator的情况下不会发生这种情况。它们阻止了这种初始化。例如reverse_iterator不允许自己使用 begin()函数进行初始化,必须使用 rbegin()进行初始化。

那么我该怎么做才能避免这种初始化?我应该写一个不同的迭代器,就像在STL中一样。我认为不可能写出来..请给我一些解决方案......

2 个答案:

答案 0 :(得分:3)

迭代器和反向迭代器有一些不同。

最明显的是:递增每个迭代器会将它们向相反的方向移动。

不太明显:begin()的返回不是反向迭代器的结尾。 begin()-1会。请记住,end()代表&#34;一个接一个的结束&#34;,因为C ++范围是半开放的,即[开始,结束]。如果只是在反向迭代器中交换begin()end(),那么反向迭代器将具有范围(开始,结束)。

换句话说,STL容器同时具有begin()end()以及rbegin()rend()的原因,即使迭代器和反向迭代器本身也是如此可能在某些方面兼容。

答案 1 :(得分:0)

要完全阻止从iterator(指针)转换为reverse_iterator,请将reverse_iterator的构造函数设为私有,并使MyVector成为reverse_iterator的朋友:

class MyVector
{
  // ...
  class reverse_iterator
  {
  private:
    friend class MyVector;
    reverse_iterator(iterator a=0) : iter(a) {}
    // ...
  };
  // ...
};

如果您希望转换可用,但不是自动转换,则只需创建相应的构造函数explicit

class MyVector
{
  // ...
  class reverse_iterator
  {
  public:
    explicit reverse_iterator(iterator a=0) : iter(a) {}
    // ...
  };
  // ...
};

在一个不相关的说明中,我也注意到你的rbegin()的实现可能会调用未定义的行为(我无法确定,因为它取决于初始化data_array的代码):你是不允许将指针递减到数组的开头。

顺便说一句,在您的情况下,关键字inline不是必需的;如果在类定义中编写成员函数体,它将自动内联。当然,inline也不会造成伤害。