C ++自定义集合reverse_iterator,具有与std :: vector实现类似的行为 [英] C++ custom collection reverse_iterator with similar behaviour to std::vector implementation

查看:153
本文介绍了C ++自定义集合reverse_iterator,具有与std :: vector实现类似的行为的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I have a template based custom collection (as we cannot use std::vector on the interface). I would like to implement a reverse_iterator specific to this collection. The reverse iterator struct below is a structure nested within the collection class. An iterator (basically a pointer to element type of the collection) is already implemented. This is my first attempt at a 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. 这可以改进吗?


推荐答案

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

Except for the things mentioned below your implementation is almost the same as the implementation in libstdc++ (v3, but still somewhat accurate). Note that you're currently missing all non-member functions. All in all you should try to match the std::reverse_iterator interface: if you're ever able to use std types you can happily exchange your mylab::reverse_iterator by std::reverse_iterator.


  1. 您缺少 reverse_iterator 之间的所有比较运算符,例如运算符== 运算符!= operator< 等等。

  1. You're missing all comparison operators between reverse_iterator, such as operator==, operator!=, operator< and so on.



< h2>奇怪的事情

这基本上是你的 reverse_iterator 与标准的不同之处。

Strange things

This is basically a list of stuff where your reverse_iterator differs from the standard one.


  1. 通常预增量/ -decrement运算符返回一个引用( * this )而不是新对象。

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

The post increment/decrement operators shouldn't take a value:

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)       { ... }


  • 复合赋值运算符通常也会返回引用。

  • The compound assignment operators also usually return references.

    而不是容器类型 T 你应该使用底层迭代器作为模板参数:

    Instead of a container type T you should use the underlying iterator as template parameter:

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

    这使您可以使用 reverse_iterator 关于 iterator_traits 可以处理的任何事情:

    This enables you to use reverse_iterator on anything that iterator_traits can handle:

    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 *> 或类似。

    With this you can even use reverse_iterator<int *> or similar.

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

    operator-> usually returns a pointer to the underlying object, not an intermediary iterator. You might want to add a pointer typedef to both your traits and your original iterator.

    这篇关于C ++自定义集合reverse_iterator,具有与std :: vector实现类似的行为的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

  • 查看全文
    登录 关闭
    扫码关注1秒登录
    发送“验证码”获取 | 15天全站免登陆