青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

eXile 的專欄

最簡單的foreach實(shí)現(xiàn)(VC & GCC)

     foreach據(jù)說已經(jīng)進(jìn)了新的C++標(biāo)準(zhǔn),不過在沒有編譯器支持以前,自己寫一個(gè)也很容易。

(1)   foreach 標(biāo)準(zhǔn)用法: 

std::vector<int> vec;
foreach(int i,  vec) {
    std::cout  
<<  i;
}


     
    (2)VC實(shí)現(xiàn)

     在最新的VC版本中原來已經(jīng)有了類似于foreach的支持,改個(gè)名字就行了:

#define foreach(var, container)   for each(var in containter)

   
    (3)GCC實(shí)現(xiàn)

    GCC沒有內(nèi)嵌支持,不過由于GCC支持typeof關(guān)鍵字, 所以實(shí)現(xiàn)起來也不是太難.  (有個(gè)bug, 在OwnWaterloo提醒下已經(jīng)糾正)
template <typename C> struct foreach_helper {
    typename C::const_iterator it, end;
    foreach_helper (
const C& c) : it(c.begin()), end(c.end()) {}
};


#define RANDOM_VAR(name, line)     RANDOM_VAR_(name, line)
#define RANDOM_VAR_(name, line)    name ## line


#define foreach(var, container)  \
__typeof__(container) 
const&   RANDOM_VAR(_con_, __LINE__) = container; \
for (foreach_helper <__typeof__(container)> _fh_(RANDOM_VAR(_con_, __LINE__)); _fh_.it != _fh_.end; ++_fh_.it) \
for (var = *_fh_.it;; __extension__ ({break;}))

   
    這里有一個(gè)特殊的考慮,就是container有可能是一個(gè)臨時(shí)對(duì)象,或者是某個(gè)函數(shù)的返回值。為了不對(duì)容器進(jìn)行復(fù)制,利用了一個(gè)不太為人所知的C++特性,就是臨時(shí)變量在存在引用時(shí),生命期會(huì)由引用變量決定。這樣保證在進(jìn)行循環(huán)時(shí)始終有效。
   
   (4)性能

      我分別使用GCC和VC9進(jìn)行了測(cè)試(優(yōu)化選項(xiàng)都使用O2),結(jié)果表明使用foreach和普通的iterator 遍歷幾乎沒有差別。不過gcc的遍歷性能要明顯好于VC9 (用個(gè)具有中國特色的結(jié)論,就是大約要好五倍),我的測(cè)試當(dāng)然很粗略,不值得相信。

    本文由eXile 原創(chuàng),轉(zhuǎn)載請(qǐng)表明原貼地址。 http://m.shnenglu.com/eXile/

posted on 2009-05-08 01:25 eXile 閱讀(3895) 評(píng)論(10)  編輯 收藏 引用 所屬分類: C/C++

評(píng)論

# re: 最簡單的foreach實(shí)現(xiàn)(VC & GCC)[未登錄] 2009-05-08 12:20 tom

用BOOST_FOREACH更好點(diǎn),使用的是ISO標(biāo)準(zhǔn)C++。VC那是CLI擴(kuò)展,非ISO標(biāo)準(zhǔn).  回復(fù)  更多評(píng)論   

# re: 最簡單的foreach實(shí)現(xiàn)(VC & GCC) 2009-05-08 12:42 OwnWaterloo

-------- -------- 引 -------- --------
這里有一個(gè)特殊的考慮,就是container有可能是一個(gè)臨時(shí)對(duì)象,或者是某個(gè)函數(shù)的返回值。為了不對(duì)容器進(jìn)行復(fù)制,利用了一個(gè)不太為人所知的C++特性,就是臨時(shí)變量在存在引用時(shí),生命期會(huì)由引用變量決定。這樣保證在進(jìn)行循環(huán)時(shí)始終有效。
-------- -------- 引 -------- --------


函數(shù)返回值就是臨時(shí)對(duì)象的一種吧?
這個(gè)特性更準(zhǔn)確描述應(yīng)該是:
const 引用可以綁定到一個(gè)臨時(shí)對(duì)象上,
臨時(shí)對(duì)象的生命周期將延長至const引用超出作用域。
臨時(shí)對(duì)象原本的生命周期僅到產(chǎn)生臨時(shí)對(duì)象的完整表達(dá)式結(jié)束。


-------- -------- 分割線 -------- --------
是否可以考慮這樣修改?
#define foreach(var, container) \
{ \
/... \
}

——1是可以避免臨時(shí)對(duì)象的生命周期被延長到不需要的地方

——2是可以避免一個(gè)bug:
#define RANDOM_VAR(name, line) name ## line
這個(gè)宏不會(huì)以你想想中的樣子工作。

至少要改成:
#define RANDOM_VAR(name, line) RANDOM_VAR_(name,line)
// 交給另一個(gè)宏
#define RANDOM_VAR_(name,line) name##line
// 才能啟動(dòng)rescan機(jī)制,將__LINE__展開


——3. 如果讓foreach_helper有一個(gè)到container的const引用, 也就不需要單獨(dú)的RANDOM_VAR去提升container的生命周期了。  回復(fù)  更多評(píng)論   

# re: 最簡單的foreach實(shí)現(xiàn)(VC & GCC) 2009-05-08 12:46 OwnWaterloo

同時(shí)…… 非常不明白 ……
為什么很多C++程序員(甚至是許多老手)都喜歡使用下劃線開頭的標(biāo)識(shí)符……
這是個(gè)非常不好的習(xí)慣……  回復(fù)  更多評(píng)論   

# re: 最簡單的foreach實(shí)現(xiàn)(VC & GCC) 2009-05-08 13:53 eXile

@OwnWaterloo
謝謝提醒,RANDOM_VAR的定義確實(shí)不對(duì),要改成你說的樣子.
不過你說的加大括號(hào)或者foreach_helper加container引用的辦法,是不行的。
至于,為什么使用下劃線開頭,正是因?yàn)檫@種命名方法不常用,所會(huì)才會(huì)避免偶然和其它變量重名的情況,一般也就是僅限于宏中使用。

  回復(fù)  更多評(píng)論   

# re: 最簡單的foreach實(shí)現(xiàn)(VC & GCC) 2009-05-08 14:53 Wealth

用宏實(shí)現(xiàn)的話,其類型不安全。
在STL中已經(jīng)有了for_each,肯定比自己實(shí)現(xiàn)的要高效。  回復(fù)  更多評(píng)論   

# re: 最簡單的foreach實(shí)現(xiàn)(VC & GCC) 2009-05-08 16:54 空明流轉(zhuǎn)

lambda 才是王道啊,嘎嘎。  回復(fù)  更多評(píng)論   

# re: 最簡單的foreach實(shí)現(xiàn)(VC & GCC) 2009-05-08 17:07 空明流轉(zhuǎn)

@Wealth
你從哪兒看出不安全?不高效?又從哪兒看出for_each和foreach是等價(jià)的了?  回復(fù)  更多評(píng)論   

# re: 最簡單的foreach實(shí)現(xiàn)(VC & GCC) 2009-05-08 18:19 螞蟻終結(jié)者

至于生命周期,大可不必用RANDOM_VAR這種方式,還是建議看一下BOOST_FOREACH
  回復(fù)  更多評(píng)論   

# re: 最簡單的foreach實(shí)現(xiàn)(VC & GCC) 2009-05-08 21:31 eXile

@空明流轉(zhuǎn)
確實(shí),沒有l(wèi)ambda之前,for_each沒什么意思。不過好消息是VC2010將會(huì)支持lambda.  回復(fù)  更多評(píng)論   

# re: 最簡單的foreach實(shí)現(xiàn)(VC & GCC) 2009-05-08 21:33 eXile

@螞蟻終結(jié)者
BOOST_FOREACH 的那陀實(shí)現(xiàn)。。。還是算了吧  回復(fù)  更多評(píng)論   

導(dǎo)航

<2009年5月>
262728293012
3456789
10111213141516
17181920212223
24252627282930
31123456

統(tǒng)計(jì)

常用鏈接

留言簿(18)

隨筆分類

隨筆檔案

服務(wù)器編程

搜索

最新評(píng)論

閱讀排行榜

評(píng)論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲视频综合| 国产亚洲电影| 亚洲欧美激情一区二区| 亚洲另类黄色| 亚洲激情在线播放| 国产精品成人一区二区艾草| 性做久久久久久久久| 亚洲永久网站| 久久久91精品国产一区二区精品| 亚洲成人在线视频播放| 激情亚洲网站| 一道本一区二区| 亚洲综合国产激情另类一区| 欧美在线视频一区二区三区| 久久在线免费观看| 亚洲久久视频| 欧美一站二站| 久久综合国产精品| 美女任你摸久久| 日韩亚洲国产欧美| 在线观看国产精品淫| 亚洲国产精品久久91精品| 亚洲精品1区2区| 一区二区三区免费看| 欧美一级黄色录像| 亚洲激情电影在线| 亚洲欧美高清| 麻豆91精品| 国产欧美日韩精品a在线观看| 在线播放视频一区| 亚洲一区在线播放| 亚洲大片一区二区三区| 亚洲一区二区不卡免费| 麻豆精品视频| 韩国av一区二区三区四区| 一本色道久久| 免费国产一区二区| 亚洲综合国产| 欧美日韩一区二区国产| 精品av久久久久电影| 亚洲欧美日本国产有色| 亚洲国产裸拍裸体视频在线观看乱了中文 | 欧美一区二区三区免费视频| 免费亚洲电影在线| 国产亚洲欧洲| 午夜亚洲福利| 亚洲美女免费视频| 欧美成人一品| 亚洲国产精品久久91精品| 久久久www免费人成黑人精品 | 午夜精品久久久久久99热软件| 女女同性女同一区二区三区91| 亚洲中午字幕| 99精品国产高清一区二区| 久久精品99国产精品酒店日本| 国产精品s色| 日韩视频在线免费| 欧美电影免费观看大全| 欧美综合二区| 国产手机视频一区二区| 香蕉成人久久| 亚洲一区二区三区视频播放| 欧美视频免费看| 国产精品99久久99久久久二8| 91久久黄色| 欧美日产一区二区三区在线观看| 99精品视频免费观看视频| 亚洲福利久久| 欧美片在线播放| 亚洲手机在线| 一区二区三区 在线观看视| 欧美体内she精视频| 亚洲欧美亚洲| 香蕉久久精品日日躁夜夜躁| 国产日韩欧美一区| 美女诱惑黄网站一区| 欧美福利电影网| 一本在线高清不卡dvd | 亚洲精品乱码久久久久久蜜桃麻豆| 卡一卡二国产精品| 亚洲精品免费在线观看| 99精品国产福利在线观看免费| 国产精品va| 久久这里有精品视频| 欧美电影免费观看| 性18欧美另类| 一区在线播放视频| 激情久久久久久久久久久久久久久久| 久久久福利视频| 美女视频一区免费观看| 亚洲免费成人| 亚洲伊人伊色伊影伊综合网| 久久综合中文| 最新高清无码专区| 欧美在线观看网站| 亚洲精品偷拍| 在线一区免费观看| 一区二区在线视频播放| 亚洲大胆人体在线| 国产精品你懂的在线| 欧美sm极限捆绑bd| 欧美激情网友自拍| 亚洲在线1234| 亚洲国产天堂久久综合| 一区二区三区国产在线观看| 好吊色欧美一区二区三区四区| 亚洲国产精品成人| 国产日韩欧美一区在线| 日韩午夜三级在线| 一区在线播放视频| 亚洲影院免费观看| 日韩午夜激情av| 欧美gay视频| 欧美午夜宅男影院| 欧美韩国日本综合| 国产无遮挡一区二区三区毛片日本| 欧美成在线观看| 国产亚洲精品一区二区| 亚洲精品一区中文| 91久久亚洲| 久久久亚洲一区| 欧美一级精品大片| 国产精品sm| 99re这里只有精品6| 在线电影一区| 欧美在线不卡视频| 欧美一区午夜精品| 国产精品igao视频网网址不卡日韩| 欧美国产一区二区| 在线电影欧美日韩一区二区私密| 亚洲深夜福利视频| 一区二区三区www| 欧美激情亚洲另类| 亚洲成人在线视频播放 | 亚洲美女在线看| 久久精品视频在线看| 欧美一区在线视频| 国产精品免费在线| 亚洲美女毛片| 一本色道久久综合亚洲精品婷婷| 亚洲国产婷婷| 亚洲女性裸体视频| 99精品国产高清一区二区| 久久久亚洲国产美女国产盗摄| 久久都是精品| 国产亚洲a∨片在线观看| 亚洲一区二区三区涩| 亚洲一区二区少妇| 欧美视频在线观看一区二区| 亚洲精品久久久久久一区二区| 亚洲人成网站999久久久综合| 美女久久一区| 亚洲精品一区二区三区婷婷月 | 国产欧美日韩在线| 亚洲欧美日韩国产一区二区三区| 午夜久久久久久| 国产色产综合产在线视频| 欧美一区二区在线视频| 美国十次成人| 亚洲精华国产欧美| 欧美日韩国产综合视频在线观看 | 亚洲一区二区免费在线| 欧美午夜不卡在线观看免费 | 久久av一区二区三区漫画| 国产精品久久久久久久久久久久| 一区二区三区不卡视频在线观看| 中文有码久久| 国产精品区一区二区三| 欧美综合激情网| 亚洲福利小视频| 亚洲一级网站| 国产最新精品精品你懂的| 裸体丰满少妇做受久久99精品| 亚洲欧洲一区二区三区| 亚洲欧美日韩高清| 亚洲大胆av| 国产精品igao视频网网址不卡日韩| 午夜一区二区三视频在线观看| 欧美大香线蕉线伊人久久国产精品| 99国内精品久久| 国产夜色精品一区二区av| 男男成人高潮片免费网站| 一区二区三区高清不卡| 久久影院午夜片一区| 在线亚洲高清视频| 国内精品久久久久影院优| 欧美日韩999| 久久久91精品国产一区二区精品| 99re8这里有精品热视频免费| 久久久www成人免费无遮挡大片 | 亚洲图片激情小说| 在线免费观看欧美| 国产精品久久久久久av福利软件| 久久久亚洲高清| 亚洲在线视频免费观看| 亚洲国产婷婷香蕉久久久久久99| 欧美一区二区三区在线观看| 亚洲精品美女在线观看| 一区二区三区在线观看国产| 国产精品成人aaaaa网站|