對於逆向迭代器,很重要的一點是需要弄清楚邏輯位置和實際位置二者的區別。
下圖顯示了逆向迭代器的位置和所指的數值:
可以發現,逆向迭代器所指位置(實際位置)和所代表的的數值(邏輯位置或數值)是不同的。C++這麼做是有其原因的。導致這個行為的原因是區間的半開性。為了能夠制定容器內的所有元素,我們必須運用最後一個元素的下一個位置。但是對於reverse迭代器而言,這個位置位於第一個元素之前。這時候問題就出現了,這個位置也許並不存在,因為容器並不要求其第一個元素之前的位置合法。www.2cto.com
因此,逆向迭代器運用了一個小技巧:實際上倒置了“半開原則”,即逆向迭代器所定義的區間不包括起點,而包括終點。但是邏輯上一如常態。這樣就導致了逆向迭代器實際所指的元素位置和邏輯上所指的元素位置就不一致。
下面再看看將一個迭代器轉化為逆向迭代器的過程:
可以發現,迭代器的實際位置(元素)不變,但是邏輯位置(元素)發生了變化。圖中pos迭代器轉化為逆向迭代器rpos後實際位置還是5,但是邏輯位置是4.即邏輯元素位置是實際位置的前一個位置。測試代碼:
[cpp]
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
vector<int> coll;
//insert elements from 1 to 9
for (int i=1; i<=9; ++i) {
coll.push_back(i);
}
//find position of element with value 5
vector<int>::iterator pos;
pos = find (coll.begin(), coll.end(),
5);
//print value to which iterator pos refers
cout << "pos: " << *pos << endl;
//convert iterator to reverse iterator rpos
vector<int>::reverse_iterator rpos(pos);
//print value to which reverse iterator rpos refers
cout << "rpos: " << *rpos <<endl;
}
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
vector<int> coll;
//insert elements from 1 to 9
for (int i=1; i<=9; ++i) {
coll.push_back(i);
}
//find position of element with value 5
vector<int>::iterator pos;
pos = find (coll.begin(), coll.end(),
5);
//print value to which iterator pos refers
cout << "pos: " << *pos << endl;
//convert iterator to reverse iterator rpos
vector<int>::reverse_iterator rpos(pos);
//print value to which reverse iterator rpos refers
cout << "rpos: " << *rpos <<endl;
}
輸出結果是(VS2008):