2013-02-27 138 views
5

我正在寫一個iterator(實際上它是const_iterator我目前的目標,我希望也能創造一個reverse_const_iterator也。C++迭代和反向迭代

我環顧四周,看看如何做到這一點,我跨this偶然:

通知然而,當一個迭代反轉時,反轉版本 不指向該範圍中的相同元件,但對一個 前述它之所以如此,以便安排爲一個範圍的過去最後 元素:它erator指向 中的過去末端元素,如果反轉,則該範圍將更改爲指向範圍的最後一個元素(不是 )(如果 已顛倒,這將是該範圍的第一個元素)。如果某個範圍中的第一個元素的迭代器與 相反,則反向迭代器指向第一個元素之前的元素(如果 顛倒過來,這將是該範圍的過去末端元素)。

這是從用戶的角度來看會發生什麼,或者取消引用reverse_iterator給你,你認爲它指向的對象的值/引用則它不是抽象的送人了?這只是實現細節?

我的理解是:

for(i = obj.rbegin(); i != obj.rend(); i++) 

相當於

for(i = obj.begin(); i != obj.end(); i++) 

除了在反向。所以*i將在第一種情況下通過容器後退,並在第二種情況下通過容器前進。我的直覺是否正確?

+2

這只是工作。 – 2013-02-27 10:07:20

+0

附註:使用迭代器時,應始終使用前增量('++ i')而不是後增量,因爲它可以更高效。 – 2014-04-25 13:24:05

回答

5

你說得對,它是一個抽象。反向迭代器包含一個正常的迭代器,如果你解除引用,它將指向你將得到的對象之後的元素。但是,這不僅僅是一個實現細節。 std::reverse_iterator適配器提供了一個成員函數調用base,它返回基礎迭代器。

該標準定義std::reverse_iterator爲具有以下關係的迭代器適配器給迭代其適配:

i由身份建立一個反向迭代和其相應的迭代器之間的基本關係:&*(reverse_iterator(i)) == &*(i - 1)

it++; 
lst.erase(it.base()); 

base的一個常見用途是從一個容器,這將像這樣進行擦除元件

如果你想這樣做,而遍歷反向容器,你會怎麼做:

it++; 
std::list<int>::reverse_iterator(lst.erase(it.base())); 
+0

作爲一個側面的問題,爲什麼要獲得'base'底層'iterator'有用? – Bingo 2013-02-27 10:08:58

+0

@Bingo:因爲容器可能期望它,例如,'erase'被指定爲採用'iterator'和* not *'reverse_iterator'。 – 2013-02-27 10:11:16

+0

@Matthieu哦,對。這就說得通了。 – Bingo 2013-02-27 10:12:38