C ++自定义集合reverse_iterator,具有与std :: vector实现类似的行为

时间:2014-01-22 05:49:04

标签: c++ iterator std

我有一个基于模板的自定义集合(因为我们不能在界面上使用std :: vector)。我想实现一个特定于此集合的reverse_iterator。下面的反向迭代器结构是嵌套在集合类中的结构。迭代器(基本上是指向集合元素类型的指针)已经实现。这是我第一次尝试反向迭代器。

    template <typename T>
    struct reverse_iterator
    {
        typedef T::iterator iterator;
        typedef T& reference;

        inline reverse_iterator(const iterator & it):_it(it){}
        inline reverse_iterator() : _it(0x0)                {}

        inline iterator base() const                        {iterator it = _it; return --it;}

        inline reverse_iterator operator ++ ()              {return reverse_iterator(--_it);}
        inline reverse_iterator operator -- ()              {return reverse_iterator(++_it);}
        inline reverse_iterator operator ++ (int val)       {_it -= val; return reverse_iterator(_it);}
        inline reverse_iterator operator -- (int val)       {_it += val; return reverse_iterator(_it);}
        inline reverse_iterator operator += (int val)       {_it -= val; return reverse_iterator(_it);}
        inline reverse_iterator operator -= (int val)       {_it += val; return reverse_iterator(_it);}

        inline reverse_iterator operator + (int val) const  {iterator it = _it - val; return reverse_iterator(it);}
        inline reverse_iterator operator - (int val) const  {iterator it = _it + val; return reverse_iterator(it);}

        bool operator == (const iterator & other) const     {return other == base();}
        bool operator != (const iterator & other) const     {return other != base();}

        reference operator*() const {return *base();}
        iterator operator->() const {return base();}

    private:    
        iterator _it;
    };
  1. 这是可行的reverse_iterator还是我错过了什么?
  2. 可以改进吗?

1 个答案:

答案 0 :(得分:2)

除了下面提到的内容之外,您的实现几乎与libstdc ++(v3中的实现相同,但仍然有些准确)。请注意,您目前缺少所有非成员函数。总而言之,您应该尝试匹配std::reverse_iterator界面:如果您能够使用标准类型,则可以通过mylab::reverse_iterator愉快地交换std::reverse_iterator

遗失的东西

  1. 您遗漏了reverse_iterator之间的所有比较运算符,例如operator==operator!=operator<等等。
  2. 奇怪的事情

    这基本上是您reverse_iterator与标准版不同的内容列表。

    1. 通常,pre-increment / -decrement运算符返回引用(*this)而不是新对象。

    2. 后递增/递减运算符不应该取值:

      inline reverse_iterator operator ++ (int)       {
        reverse_iterator tmp = *this;
        ++*this; // implement post-increment in terms of pre-increment!
        // or --_it;
        return tmp;
      }
      inline reverse_iterator operator -- (int)       { ... }
      
    3. 复合赋值运算符通常也会返回引用。

    4. 您的const iterator&构造函数应为explicit ,否则可能会意外混合反向和正常迭代器。
    5. 您应该使用底层迭代器作为模板参数,而不是容器类型T

      template <typename Iterator>
      struct reverse_iterator
      {
          typedef Iterator iterator;
          typedef typename iterator_traits<Iterator>::reference reference;
          ...
      }
      

      这使您可以对reverse_iterator可以处理的任何内容使用iterator_traits

      template <class Iterator>
      struct iterator_traits{
        typedef typename Iterator::reference reference;
        // Add other things
      };
      
      template <class T>
      struct iterator_traits<T*>{
        typedef T & reference;
      };
      

      有了这个,你甚至可以使用reverse_iterator<int *>或类似的。

    6. operator->通常返回指向底层对象的指针,而不是中间迭代器。您可能希望为您的特征和原始迭代器添加pointer typedef。

    7. 非常 不常见,检查不同类型之间的相等性。删除operator==(const iterator&)