• <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ù)博客

            兔子

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

            留言簿(10)

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            轉(zhuǎn)自:http://dev.csdn.net/article/17/17508.shtm
            (只轉(zhuǎn)了一部分)

            因?yàn)?C++語(yǔ)言已經(jīng)于1998年被標(biāo)準(zhǔn)化,C++的中堅(jiān)分子在努力推動(dòng)程序員從數(shù)組轉(zhuǎn)到vector時(shí)就沒(méi)什么顧慮了。同樣顯然的情況也發(fā)生于嘗試使開(kāi)發(fā)者從char*指針遷移到string對(duì)象的過(guò)程中。有很好的理由來(lái)做這些轉(zhuǎn)變,包括可以消除常見(jiàn)的編程錯(cuò)誤(參見(jiàn)條款13),而且有機(jī)會(huì)獲得STL算法的全部強(qiáng)大能力(比如參見(jiàn)條款31)。

            但是,障礙還是有的,最常見(jiàn)的一個(gè)就是已經(jīng)存在的傳統(tǒng)C風(fēng)格的API接受的是數(shù)組和char*指針,而不是vector和string對(duì)象。這樣的API函數(shù)還將會(huì)存在很長(zhǎng)時(shí)間,如果我們要高效使用STL的話,就必須和它們和平共處。

            幸運(yùn)的是,這很容易。如果你有一個(gè)vector對(duì)象v,而你需要得到一個(gè)指向v中數(shù)據(jù)的指針,以使得它可以被當(dāng)作一個(gè)數(shù)組,只要使用&v[0]就可以了。對(duì)于string對(duì)象s,相應(yīng)的咒語(yǔ)是簡(jiǎn)單的s.c_str()。但是是只讀的。如廣告中難懂的條文時(shí)常指出的,必然會(huì)有幾個(gè)限制。

            給定一個(gè)

            vector<int> v;
            表達(dá)式v[0]生產(chǎn)一個(gè)指向vector中第一個(gè)元素的引用,所以,&v[0]是指向那個(gè)首元素的指針。vector中的元素被C++標(biāo)準(zhǔn)限定為存儲(chǔ)在連續(xù)內(nèi)存中,就像是一個(gè)數(shù)組,所以,如果我們想要傳遞v給這樣的C風(fēng)格的API:
            void doSomething(const int* pInts, size_t numInts);

            我們可以這么做:

            doSomething(&v[0], v.size());

            也許吧??赡馨?。唯一的問(wèn)題就是,如果v是空的。如果這樣的話,v.size()是0,而&v[0]試圖產(chǎn)生一個(gè)指向根本就不存在的東西的指針。這不是件好事。其結(jié)果未定義。一個(gè)較安全的方法是這樣:

            
            
            if (!v.empty()) {
             doSomething(
            &v[0], v.size());
            }

            如果走錯(cuò)路了,你可能會(huì)碰到一些半吊子的人物,他們會(huì)告訴你說(shuō)可以用v.begin()代替&v[0],因?yàn)椋ㄟ@些討厭的家伙將會(huì)告訴你)begin返回指向vector內(nèi)部的迭代器,而對(duì)于vector,其迭代器實(shí)際上是指針。那經(jīng)常是正確的,但正如條款50所說(shuō),并不總是如此,你不該依賴于此。begin的返回類型是iterator,而不是一個(gè)指針,當(dāng)你需要一個(gè)指向vector內(nèi)部數(shù)據(jù)的指針時(shí)絕不該使用begin。如果你基于某些原因決定鍵入v.begin(),就應(yīng)該鍵入&*v.begin(),因?yàn)檫@將會(huì)產(chǎn)生和&v[0]相同的指針,這樣可以讓你有更多的打字機(jī)會(huì)而且讓其他要弄懂你代碼得人感覺(jué)到更晦澀。坦白地說(shuō),如果你正在和告訴你使用v.begin()代替&v[0]的人打交道的話,你該重新考慮一下你的社交圈了。(譯注:在VC6中,如果用v.begin()代替&v[0],編譯器不會(huì)說(shuō)什么,但在VC7和GCC中這么做的話,就會(huì)引發(fā)一個(gè)編譯錯(cuò)誤)

            類似從vector上獲取指向內(nèi)部數(shù)據(jù)的指針的方法,對(duì)string不是可靠的,因?yàn)椋?)string中的數(shù)據(jù)并沒(méi)有承諾被存儲(chǔ)在連續(xù)內(nèi)存中,(2)string的內(nèi)部表示形式并沒(méi)承諾以一個(gè)null字符結(jié)束。這解釋了string的成員函數(shù)c_str存在的原因,它返回一個(gè)按C風(fēng)格設(shè)計(jì)指針,指向string的值。因此我們可以這樣傳遞一個(gè)string對(duì)象s給這個(gè)函數(shù),

            。。。。。。。。。。。
            。。。。。。。。。

            posted on 2009-11-19 16:19 會(huì)飛的兔子 閱讀(312) 評(píng)論(0)  編輯 收藏 引用 所屬分類: C++庫(kù),組件
            久久精品国产亚洲AV不卡| 久久久噜噜噜www成人网| 久久99精品久久久久子伦| 欧美色综合久久久久久| 久久精品亚洲欧美日韩久久| 亚洲天堂久久精品| 97久久精品人人做人人爽| 免费国产99久久久香蕉| 日本久久久久久中文字幕| 色综合久久久久网| 精品乱码久久久久久夜夜嗨| 国产综合精品久久亚洲| 久久伊人亚洲AV无码网站| 怡红院日本一道日本久久| 日本三级久久网| 久久伊人影视| 久久久久亚洲精品无码蜜桃 | 伊人久久综合精品无码AV专区 | 久久久亚洲裙底偷窥综合| 久久久www免费人成精品| 久久天天躁狠狠躁夜夜躁2O2O| 久久久久亚洲AV无码专区体验| 国产成人精品久久二区二区| 99久久精品国产毛片| 中文成人久久久久影院免费观看| 亚洲伊人久久大香线蕉综合图片| 99re这里只有精品热久久| 国产精品久久久久久久久久免费| 天天影视色香欲综合久久| 一本色道久久HEZYO无码| 99久久婷婷国产综合精品草原| 中文成人无码精品久久久不卡 | 国产成人久久激情91| 亚洲精品乱码久久久久久不卡| 久久久久波多野结衣高潮| 日韩精品久久久久久| 久久久久se色偷偷亚洲精品av | 亚洲精品NV久久久久久久久久| 国产成人久久精品一区二区三区 | 亚洲性久久久影院| 久久久久久狠狠丁香|