• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            兔子的技術(shù)博客

            兔子

               :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
              202 Posts :: 0 Stories :: 43 Comments :: 0 Trackbacks

            留言簿(10)

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            轉(zhuǎn)自:http://blog.csdn.net/kuanghong/archive/2008/08/20/2801280.aspx

            調(diào)用reverse_iterator的base成員函數(shù)可以產(chǎn)生“對(duì)應(yīng)的”iterator,但這句話有些辭不達(dá)意。舉個(gè)例子,看一下這段代碼,我們首先把從數(shù)字1-5放進(jìn)一個(gè)vector中,然后產(chǎn)生一個(gè)指向3的reverse_iterator,并且通過
            reverse_iterator的base初始化一個(gè)iterator:

             

            vector v; 
            v.reserve(
            5); // 參見條款14 
            for(int i = 1;i <= 5++ i) { // 向vector插入1到5 
            v.push_back(i); 

            vector::reverse_iterator ri 
            = // 使ri指向3 
            find(v.rbegin(), v.rend(), 3); 
            vector::iterator i(ri.
            base()); // 使i和ri的base一樣

             

            執(zhí)行上述代碼后,可以想到產(chǎn)生的結(jié)果就像這樣: 
             
            這張圖很好,顯示了reverse_iterator和它對(duì)應(yīng)的base iterator之間特有的偏移量,就像rbegin()和rend()與相關(guān)的begin()和end()一樣,但并沒有說出了所有你需要知道的東西。特別是,它并沒有解釋怎樣在ri上實(shí)現(xiàn)你在i上想要完成的操作。有些容器的成員函數(shù)只接受iterator類型的參數(shù),所以如果你想要在ri所指的位置插入一個(gè)新元素,你不能直接這么做,因?yàn)関ector的insert函數(shù)不接受reverse_iterator。如果你想要?jiǎng)h除ri 所指位置上的元素也會(huì)有同樣的問題。erase成員函數(shù)會(huì)拒絕reverse_iterator,堅(jiān)持要求iterator。為了完成刪除和一些形式的插入操作,你必須先通過base函數(shù)將reverse_iterator轉(zhuǎn)換成iterator,然后用iterator來完成工作。
            先讓我們假設(shè)你要在ri指出的位置上把一個(gè)新元素插入v。特別的,我們假設(shè)你要插入的值是99。記住ri在上
            圖中遍歷的順序是自右向左,而且插入操作會(huì)將新元素插入到ri位置,并且將原先ri位置的元素移到遍歷過程
            的“下一個(gè)”位置,我們認(rèn)為3應(yīng)該出現(xiàn)在99的左側(cè)。插入操作之后,v看起來像這樣: 
             
            當(dāng)然,我們不能用ri來指定插入的地方,因?yàn)樗皇且粋€(gè)iterator。我們必須用i來代替。如上所述,當(dāng)ri指向3時(shí),i(就是ri.base())指向4。如果我們用ri來指定插入位置,那么用i指向插入位置,那個(gè)假設(shè)就是正確的。結(jié)論呢?
            ● 要實(shí)現(xiàn)在一個(gè)reverse_iterator ri指出的位置上插入新元素,在ri.base()指向的位置插入就行了。對(duì)于
            insert操作而言,ri和ri.base()是等價(jià)的,而且ri.base()真的是ri對(duì)應(yīng)的iterator。
            現(xiàn)在再來考慮刪除元素的情況。回顧一下最初的vector(也就是在插入99之前)ri與i的關(guān)系: 
             
            如果你要?jiǎng)h除ri指向的元素,你不能直接使用i了,因?yàn)閕與ri不是指向同一個(gè)元素。因此,你要?jiǎng)h除的是i的前一個(gè)元素。
            ● 要實(shí)現(xiàn)在一個(gè)reverse_iterator ri指出的位置上刪除元素,就應(yīng)該刪除ri.base()的前一個(gè)元素。對(duì)于刪除操作而言,ri和ri.base()并不等價(jià),而且ri.base()不是ri對(duì)應(yīng)的iterator。
            我們還是有必要看看刪除操作的代碼,因?yàn)樗€挺令人驚訝的。

             

            vector v; 
             
            // 向v插入1到5,同上 
            vecot::reverse_iterator ri = 
            find(v.rbegin(), v.rend(), 
            3); // 同上,ri指向3 
            v.erase(--ri.base()); // 嘗試刪除ri.base()前面的元素;對(duì)于vector,一般來說編譯不通過

             

            這個(gè)設(shè)計(jì)并不存在什么問題。表達(dá)式--ri.base()確實(shí)能夠指出我們需要?jiǎng)h除的元素。而且,它們能夠處理除了
            vector和string之外的其他所有容器。它可能也能處理vector和string,但對(duì)于大多數(shù)vector和string的實(shí)現(xiàn),它無。在這樣的實(shí)現(xiàn)下,iterator(和const_iterator)會(huì)采用內(nèi)建的指針來實(shí)現(xiàn),所以ri.base()的結(jié)果是一個(gè)指針。C和C++都規(guī)定了不能直接修改函數(shù)返回的指針,所以在string和vector的迭代器是指針的STL平臺(tái)上,像--ri.base()這樣的表達(dá)式無法通過編譯。要移植從一個(gè)由reverse_iterator指出的位置刪除元素時(shí),你應(yīng)該盡量避免修改base的返回值。沒問題。如果你不能減少調(diào)用base的返回值,只需要先增加reverse_iterator的值,然后再調(diào)用base!

             

             // 同上 
            v.erase((++ri).base()); // 刪除ri指向的元素; 
            // 這下編譯沒問題了!

             

            因?yàn)檫@個(gè)方法適用于所有的標(biāo)準(zhǔn)容器,這是刪除一個(gè)由reverse_iterator指出的元素時(shí)首選的技巧。
            現(xiàn)在已經(jīng)很清楚了,reverse_iterator的base成員函數(shù)返回一個(gè)“對(duì)應(yīng)的”iterator的說法并不準(zhǔn)確。對(duì)于插入操作而言,的確如此;但是對(duì)于刪除操作,并非如此。當(dāng)需要把reverse_iterator轉(zhuǎn)換成iterator的時(shí)候,有一點(diǎn)非常重要的是你必須知道你準(zhǔn)備怎么處理返回的iterator,因?yàn)橹挥羞@樣你才能決定你得到的iterator是否是你需要的。

             

            本文來自CSDN博客,轉(zhuǎn)載請(qǐng)標(biāo)明出處:http://blog.csdn.net/kuanghong/archive/2008/08/20/2801280.aspx

            posted on 2010-03-10 09:54 會(huì)飛的兔子 閱讀(2021) 評(píng)論(0)  編輯 收藏 引用 所屬分類: C++庫,組件
            99久久精品免费看国产一区二区三区 | 亚洲精品国精品久久99热| 午夜精品久久久久久中宇| 中文字幕精品久久久久人妻| 国产精品成人无码久久久久久| 久久中文字幕一区二区| 久久99精品久久久久久| 国产亚洲婷婷香蕉久久精品| 久久精品国产99国产精品澳门| 久久99热精品| 国产ww久久久久久久久久| 久久免费视频一区| 青青草原综合久久大伊人| 囯产极品美女高潮无套久久久| 亚洲女久久久噜噜噜熟女| 无码超乳爆乳中文字幕久久| 国产亚洲欧美精品久久久| 国内精品久久久久| 久久国产美女免费观看精品| 婷婷久久综合九色综合九七| 狠狠色婷婷久久一区二区| 久久精品人人做人人爽电影蜜月| 国产精品久久久久影院嫩草| 狠狠综合久久综合中文88| 香蕉久久久久久狠狠色| 久久精品亚洲精品国产色婷| 国产成人精品久久一区二区三区av| 久久人人爽人人精品视频| 久久伊人精品一区二区三区| 潮喷大喷水系列无码久久精品| 国产精品激情综合久久| 狠狠色丁香婷婷久久综合| 久久精品一区二区| 无码八A片人妻少妇久久| 久久国产精品-国产精品| 国内精品伊人久久久久妇| 久久精品国产精品亚洲精品| 国产精品乱码久久久久久软件| 亚洲午夜久久久精品影院| 2021国内久久精品| 久久久人妻精品无码一区|