reverse iterator的補償機制

2021-07-02 13:18:33 字數 1420 閱讀 7292

反向迭代器(reverse iterator)是一種反向遍歷容器的迭代器。

比如,vector類中有乙個名為rbegin()的成員函式和乙個名為rend()的成員函式。rbegin()返回乙個指向超尾的反向迭代器,rend()返回指向第乙個元素的反向迭代器。

正因為它是反向迭代器,所以將自增(和自減)的含義反過來了:對於反向迭代器,++運算將導致它被遞減,--運算將導致它被遞增。我們來看一下它的原始碼(stl_iterator.h):

//prefix ++

reverse_iterator&

operator++()

//postfix ++

reverse_iterator

operator++(int)

//prefix --

reverse_iterator&

operator--()

//postfix --

reverse_iterator

operator--(int)

那麼第乙個問題來了,為什麼不直接對常規迭代器進行遞減呢?主要的原因是為了簡化對已有的函式的使用。

比如copy()函式可以將資料從乙個容器複製到另外乙個容器中。這種演算法是以迭代器方式實現的。

比如:

int casts[10] = ;

vectordice(10);

copy(casts, casts+10, dice.begin()); //copy array to vector

copy()的前兩個迭代器引數表示要複製的範圍,即源位址的範圍。最後乙個迭代器引數表示目的位址的起始位置。copy()函式將覆蓋目標容器中已有的資料,同時

目標容器必須足夠大,以便能夠容納被複製的元素。

現在,假如想把vector容器dice中的10個元素再逆序寫回casts陣列中,如果有了反向迭代器,那麼我們就還可以使用copy()來完成這項工作。

copy(dice.rbegin(), dice.rend(), casts);

看到這裡,我們肯定會有乙個很大的疑問:rbegin()返回的是超尾,因此我們不能對該位址進行解引用操作,同時,rend()返回的是第乙個元素的位置,這會導致提前乙個元素就結束了。是的,所有認真思考的人第一次都會有這樣的疑問。為解決剛剛提到的這兩個問題,反向迭代器做出了一種特殊的補償機制,請看它的解引用過載函式:

reference

operator*() const

反向指標通過先遞減,再解引用來解決這兩個問題。同時,從上面的**可以看出,通過解引用操作符,雖然返回的是前乙個元素的值,但是,

當前迭代器的值並沒有改變。理解這一點很重要。

done!

擦除的補償

擦除丟失了在泛型 中執行某些操作的能力,任何在執行時需要知道確切型別資訊的操作都將無法進行,通過型別標籤來對擦除進行補償。package com.cognizant.ch15 class building class house extends building public class class...

擦除的補償

擦除丟失了在泛型 中執行某些操作的能力,任何在執行時需要知道確切型別資訊的操作都將無法進行,通過型別標籤來對擦除進行補償。package com.cognizant.ch15 class building class house extends building public class class...

運放的補償原因

補償的原因 運放補償技術有很多種,如 主極點補償 增益補償 超前補償 補償衰減器 以及 超前 滯後補償 任何補償技術的理想結果都是從純穩定性角度使多極點系統 高階系統 接近單極點整體系統,因為單極點反饋系統是無條件穩定的。補償實現 大多數補償技術至少能實現有效的雙極點系統狀態,其中第二個極點 第乙個...