對於逆向迭代器,很重要的一點是需要弄清楚邏輯位置和實際位置二者的區別。
下圖顯示了逆向迭代器的位置和所指的數值:
可以發現,逆向迭代器所指位置(實際位置)和所代表的的數值(邏輯位置或數值)是不同的。c++這麼做是有其原因的。導致這個行為的原因是區間的半開性。為了能夠制定容器內的所有元素,我們必須運用最後乙個元素的下乙個位置。但是對於reverse迭代器而言,這個位置位於第乙個元素之前。這時候問題就出現了,這個位置也許並不存在,因為容器並不要求其第乙個元素之前的位置合法。www.2cto.com
因此,逆向迭代器運用了乙個小技巧:實際上倒置了「半開原則」,即逆向迭代器所定義的區間不包括起點,而包括終點。但是邏輯上一如常態。這樣就導致了逆向迭代器實際所指的元素位置和邏輯上所指的元素位置就不一致。
下面再看看將乙個迭代器轉化為逆向迭代器的過程:
可以發現,迭代器的實際位置(元素)不變,但是邏輯位置(元素)發生了變化。圖中pos迭代器轉化為逆向迭代器rpos後實際位置還是5,但是邏輯位置是4.即邏輯元素位置是實際位置的前乙個位置。測試**:
[cpp]
#include
#include
#include
using namespace std;
int main()
//find position of element with value 5
vector::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::reverse_iterator rpos(pos);
//print value to which reverse iterator rpos refers
cout << "rpos: " << *rpos
#include
#include
using namespace std;
int main()
//find position of element with value 5
vector::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::reverse_iterator rpos(pos);
//print value to which reverse iterator rpos refers
cout << "rpos: " << *rpos <
vector逆向迭代器
include using namespace std include include intmain cout v1 endl vector int v1 簡單理解v.begin 與v.rbegin 的區別 乙個將vector陣列的前面當作頭,乙個將vector陣列的後面當作頭。於是。如果頭指標要...
C 標準庫 Reverse(逆向)迭代器
reverse 逆向 迭代器 reverse迭代器是一種配接器,重新定義遞增遞減運算,使其行為正好倒置,這樣使迭代器以逆向來處理元素。rbegin 傳回逆向遍歷的第乙個元素,也就是實際上最後乙個元素的位置 rend 傳回逆向遍歷時最後乙個元素的下乙個位置,也就是實際上第乙個元素的前乙個位置 示例 i...
迭代器 反向迭代器
c primer 中文版第四版 第273頁 9.3.2 begin和end成員 begin和end操作產生指向容器內第乙個元素和最後乙個元素的下乙個位置的迭代器,如下所示。這兩個迭代器通常用於標記包含容器中所有元素的迭代範圍。c.begin 返回乙個迭代器,它指向容器c的第乙個元素 c.end 返回...