2012-04-29 91 views
1

完成之後的我有以下代碼:迭代器值從反向迭代值轉換

int main() 
{ 
    vector<int> v; 

    for(int i = 0; i < 10; ++i) 
     v.push_back(i); 

    auto it = v.begin() + 3; 

    cout << "Iterator: " << *it << endl; 

    vector<int>::reverse_iterator revIt(it); 

    cout << "Reverse iterator: " << *revIt << endl; 

} 

運行此代碼我得到以下輸出後:

Iterator: 3 
Reverse iterator: 2 

有人能解釋爲什麼2個值不同?

+0

我不是100%確定的,但前向迭代器會向前看,而反向迭代器會回頭看。 'v = {1,2,* 3,4 ...}'其中*是它們兩者的迭代器位置。看看他們要走哪個方向。 – chris

+0

@chris:不完全是:或者更好,這是java如何定義迭代器(指向「之間」)C++有不同的概念。但實際結果也是按照你的解釋。但結果是,而不是定義。 –

+0

@EmilioGaravaglia,謝謝你的清理。這不是我所熟悉的。 – chris

回答

5

反向迭代「對應」到base迭代用,因爲如何rbegin()rend()必須使用鹼迭代器是有效的(end()begin()分別)表示一種元素的偏移量。例如,rend()不能由在容器的迭代器之前'指向'的interator表示,儘管這是它在邏輯上表示的內容。所以rend()的'基本迭代器'是begin()。因此,rbegin()的基本迭代器變爲end()。 反向迭代器在解除引用時會自動調整該偏移量(使用*->運算符)。

article by Scott Meyers解釋了一個漂亮的圖片以及詳細的關係:

準則3:瞭解如何使用reverse_iterator的的基本迭代器

調用一個reverse_iterator的收益率基本成員函數 「對應」的迭代器,但它不是很清楚這意味着什麼。 作爲一個例子,看看這個代碼,這使該數字1-5中 載體中,設置一個reverse_iterator的指向3,並設置一個 迭代器reverse_iterator的鹼:

vector<int> v; 

// put 1-5 in the vector 
for (int i = 1; i <= 5; ++i) { 
    v.push_back(i); 
} 

// make ri point to the 3 
vector<int>::reverse_iterator ri = 
    find(v.rbegin(), v.rend(), 3); 

// make i the same as ri's base 
vector<int>::iterator i(ri.base()); 

執行此代碼後,事情可以被認爲是看起來像 這樣:

alt text

這張照片很不錯,顯示特性的 reverse_iterator的和correspondi偏移模仿 對於rbegin()和雷德()的偏移量開始納克基本的迭代器()和()結束,但 它不會告訴你,你需要知道的一切。特別是, 沒有解釋如何使用我執行您想要在ri上執行的操作。

4

看起來像documentation表示他們這樣做來處理過去結束的元素,即如果您顛倒了結束時的迭代器,新的逆向迭代器指向最後一個元素。

2

的24.5.1反向迭代器第一段表示:

類模板reverse_iterator的是一個迭代器適配器,從通過其底層迭代器限定到該序列的開頭的序列的結束迭代。反向迭代器與其對應的迭代器i之間的基本關係由以下標識建立:
&*(reverse_iterator(i)) == &*(i - 1)

rend()返回的值不能指向begin()之前,因爲這是無效的。所以決定rend()應該包含begin()的值,並且所有其他反向迭代器將被進一步移位一個位置。 operator*彌補了這一點,並無論如何訪問正確的元素。

1

反向迭代看起來總是「一個之前」,然後向前,因爲它的範圍是由一個移動:

前向迭代從雲開始()(第一個元素)end()的(過去的最後一個:開始 - 結束)在端側敞開)

反向迭代從rbegin() { return reverse_iterator(end()); }定義去rend() { return reverse_iterator(begin()); },但也有走開放範圍[rbegin,撕裂),具有rbegin是最後(不是「過去最後一個「),並傾向於在」第一個「之前(而不是」第一個「),因此需要適應一個差異。