2014-10-10 140 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也不會傷害。