2014-10-10 156 views
0

我正在写一个反向迭代器作为我自己定制的矢量类的一部分。直到现在我写的是如下。STL容器迭代器和C指针迭代器有什么区别

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 

上面的类iterater只是C风格的指针而reverse_iterator是类。所以,当我这样做

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

我reverse_iterator的被初始化与()开始功能和代码编译和运行。但是,在STL的迭代器和reverse_iterator中不会发生这种情况。他们阻止这种初始化。例如reverse_iterator不允许用开始()函数初始化,它必须用rbegin()初始化。

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

+0

您明确允许将'iterator'转换为'reverse_iterator',因为您已经为后者提供了前者的转换构造函数。删除该构造函数。 – juanchopanza 2014-10-10 06:16:51

+1

如果将代码示例缩减为[MCVE](http://stackoverflow.com/help/mcve),会更容易。很多代码与问题无关,但没有足够的编译。 – juanchopanza 2014-10-10 06:17:56

回答

3

迭代器和逆迭代器有一些差异。

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

不太明显:返回的begin()而不是反向迭代器的结束。 begin()-1会。请记住,end()代表“one-past-the-end”,因为C++范围是半开放的,即[开始,结束]。如果你只是在你的反向迭代交换begin()end()那么你的反向迭代器将有范围(开始,结束。

换句话说,还有一个原因,STL容器兼得begin()end()rbegin()rend(),甚至如果迭代和反向迭代器本身可能是在某些方面兼容

0

完全防止转化率从iterator(指针)reverse_iterator,使reverse_iterator私人构造,使MyVectorreverse_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也不会伤害。