C++学习之路: STL探索之 reverse_iterator 的一个小陷阱

1 2.reverse迭代器
2 a)    在逻辑上,rbegin指向最后一个元素,rend指向第一个元素的前一个位置。
3 b)    但是在实际实现上,rbegin指向最后一个元素的下一个位置,rend指向第一个元素。
4 c)    reverse迭代器的物理位置与逻辑位置差1
5 d)    逻辑值比物理位置减少了1.

引言:

vector<int> vec 我们push_back是十个数

           it

     0  1  2  3  4  5  6  7  8  9  

                                       r_it

我们用 vector<int>:: iterator it = vec.find(begin(), end(), 5) //it现在指向 5所在pos

我们再定义一个逆向的迭代器

vector<int>:: reverse_iterator r_it(it) ; //用it初始化逆向 迭代器。

如果我们打印一下 r_it 结果却是4 。

 1 #include <iostream>
 2 #include <string>
 3 #include <vector>
 4 
 5 using namespace std;
 6 
 7 int main(int argc, const char *argv[])
 8 {
 9     vector<int> vec;
10 
11     for (int i = 0; i <= 9; i++) {
12         vec.push_back(i) ;
13     }
14 
15     vector<int>::iterator it = vec.begin() ;
16     while( *it != 5)
17     {
18         it++ ;
19     }
20     cout << *it << endl;
21     
22     vector<int>::reverse_iterator r_it(it) ;
23 
24     cout << *r_it << endl;
25     return 0;
26 }
27 
28 结果:
29                                                                                                                                                              
30 ➜  homework  ./a.out
31 5
32 4