天天看點

STL 逆向疊代器 reverse_iterator 的邏輯位置與實際位置

對于逆向疊代器,很重要的一點是需要弄清楚邏輯位置和實際位置二者的差別。

下圖顯示了逆向疊代器的位置和所指的數值:

STL 逆向疊代器 reverse_iterator 的邏輯位置與實際位置

可以發現,逆向疊代器所指位置(實際位置)和所代表的的數值(邏輯位置或數值)是不同的。C++這麼做是有其原因的。導緻這個行為的原因是區間的半開性。為了能夠制定容器内的所有元素,我們必須運用最後一個元素的下一個位置。但是對于reverse疊代器而言,這個位置位于第一個元素之前。這時候問題就出現了,這個位置也許并不存在,因為容器并不要求其第一個元素之前的位置合法。

是以,逆向疊代器運用了一個小技巧:實際上倒置了“半開原則”,即逆向疊代器所定義的區間不包括起點,而包括終點。但是邏輯上一如常态。這樣就導緻了逆向疊代器實際所指的元素位置和邏輯上所指的元素位置就不一緻。

測試代碼:

結果:

pos: 5

rpos: 4

原理如下圖:

STL 逆向疊代器 reverse_iterator 的邏輯位置與實際位置