2014-10-07 37 views
2

初學者到C++,我想知道operator ++如何向後移動迭代器。正如我所知,iterator.begin()和iterator.end()分別返回指向第一個索引和最後一個索引的指針。C++中反向迭代器的工作原理

vector<int>::iterator it = myvector.begin(); 

當我們做它++它會移動到下一個索引。這對我來說很清楚,但我完全和逆向迭代器混淆了。

vector<int>::reverse_iterator rit = myvector.rbegin(); 

當我們做RIT ++它會移動到落後。我想知道這是如何實現的逆向迭代器的情況下。是運營商超載還是我不知道的東西?請給我正確的方式來理解這些事情。

請給予更多的細節知識。

+0

這裏有一個很好的解釋:http://en.cppreference.com/w/cpp/iterator/reverse_iterator。 – juanchopanza 2014-10-07 06:11:36

+0

感謝給定的鏈接。它清除了這個概念。你可以給我一個鏈接,它會顯示reverse_itrator的operator ++函數的清晰實現。 – Swapnil 2014-10-07 09:10:01

回答

2

據我所知iterator.begin()iterator.end()分別返回指向第一個索引和最後一個索引的指針。

關閉,但不一定是:

  • 他們返回iterator S,不是指針....

  • end()返回迭代這是概念上的 「過去」 的最後一個有效指標。

在內部,vectoriterator小號通常做存儲指針,雖然,在一個iterator++--經過轉發重載操作者執行一個對應於指針++--

對於反向迭代器,過載的operator++只是對指針執行--,反之亦然。例如,我的計算機上的Visual C++庫執行此在class _Revranit,從中reverse_iterator導出:

_Myt& operator++() 
      { 
      --current; 
      return (*this); 
      } 

    _Myt operator++(int) 
      { 
      _Myt _Tmp = *this; 
      --current; 
      return (_Tmp); 
      } 
0

是的,有一個reverse_iterator::operator++過載從最後一個元素向後「前進」到一個開始之前。

的行爲等同於(在頁面上cppreference可能包含一種可能的實現)

reverse_iterator operator++(int) 
    { 
     reverse_iterator __tmp(*this); 
     --current; // This is an internal iterator 
     return __tmp; 
    } 

請注意,這是如何實現的究竟可以從實現而異。就你遵守標準要求而言,你有一定的自由度。

2

當你做it++rit++他們並不真正的意思是「在集合中向前或向後移動」,它們都意味着「移動到你想要迭代的下一個元素」。

如果您使用begin(),則表示「我想向前迭代」,因此it++向前移動。

如果您使用rbegin(),則表示「我想向後迭代」,因此rit++向後移動。

0

一個反向迭代R和I它從構造的迭代之間的關係是:

&*r == &*(i-1) 

如果是在序列中的一過去的最端部元件,在相反的順序點*( - 1),然後在第一元件

1
_***************_ 
^begin ++---> ^end 
^rend <---++ ^rbegin 
+1

可能一些解釋會使這個反應更好! – 2014-10-07 07:16:12

+0

如果我添加一些解釋,我會重複其他答案。我只是覺得在這種情況下,一張圖片比一百個字要好。 – 2014-10-07 16:29:09