簡體   English   中英

STL容器迭代器和C指針迭代器有什么區別

[英]What is the difference between STL containers iterator and C pointer iterator

我正在編寫一個反向迭代器,作為我自己的自定義矢量類的一部分。 到目前為止,我所寫的內容如下。

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用begin()函數初始化,代碼正在編譯並運行。 但這在STL的迭代器和reverse_iterator情況下不會發生。 它們阻止了這種初始化。 例如:reverse_iterator不允許使用begin()函數初始化自己,而必須使用rbegin()初始化。

那么我該怎么做才能避免這種初始化呢? 我應該寫一個像STL中一樣的不同迭代器嗎? 而且我認為這是不可能的..請給我一些解決方案...

迭代器和反向迭代器有一些區別。

最明顯的是:增加每個迭代器的方向是相反的。

不太明顯: begin()的返回不是反向迭代器的結尾。 begin()-1將會是。 記住end()表示“一個過去”,因為C ++范圍是半開的,即[begin,end)。 如果僅在反向迭代器中交換begin()end() ,則反向迭代器將具有范圍(開始,結束)。

換句話說,即使迭代器和反向迭代器本身在某些方面兼容,STL容器也具有begin()end()以及rbegin()rend()的原因是有原因的。

為了完全防止從iterator (指針)到reverse_iterator轉換,請將reverse_iterator的構造reverse_iterator MyVector私有,並使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也不會有任何傷害。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM