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

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://www.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>
            妖精成人www高清在线观看| 日韩视频在线播放| 亚洲综合色激情五月| 亚洲黄色三级| 农村妇女精品| 一区二区电影免费观看| 在线亚洲观看| 国语自产在线不卡| 嫩草国产精品入口| 欧美日韩的一区二区| 亚洲影院在线观看| 久久激情视频免费观看| 亚洲靠逼com| 亚洲性线免费观看视频成熟| 国产亚洲欧美日韩一区二区| 狼狼综合久久久久综合网| 女人香蕉久久**毛片精品| 中文一区在线| 久久久久国产免费免费| 在线视频日韩精品| 欧美在线影院| 亚洲一区二区三区视频| 久久九九电影| 在线综合亚洲| 欧美一区二区日韩| 亚洲最新在线| 久久精品视频导航| 亚洲一区视频| 欧美chengren| 久久久久免费视频| 欧美日韩在线播放| 欧美大片免费| 国产美女一区二区| 亚洲区欧美区| 在线观看国产精品网站| 亚洲性感美女99在线| 亚洲国产精品第一区二区三区| 亚洲视屏一区| 99re亚洲国产精品| 老巨人导航500精品| 亚洲欧美激情诱惑| 欧美精品一区视频| 欧美 日韩 国产精品免费观看| 国产精品视频一| 在线亚洲美日韩| 亚洲美女中出| 欧美成人免费在线| 亚洲一级在线| 国内精品久久久久久久果冻传媒 | 欧美一级一区| 欧美日韩精品一区二区天天拍小说 | 久久久久久久久久久久久9999| 亚洲一级二级| 欧美日韩在线大尺度| 亚洲国产日韩欧美在线图片| 伊人狠狠色丁香综合尤物| 午夜精品一区二区三区在线播放| 夜夜爽www精品| 欧美精品大片| 亚洲日本成人网| 日韩视频二区| 欧美日韩精品免费观看| 亚洲精品一区二区三区婷婷月| 亚洲国产精品尤物yw在线观看| 久久亚洲精品伦理| 欧美成人在线免费观看| 亚洲人成网站色ww在线| 欧美交受高潮1| 亚洲毛片一区二区| 亚洲欧美www| 国产欧美在线| 久久野战av| 亚洲国产成人在线播放| 日韩视频在线免费观看| 欧美午夜a级限制福利片| 亚洲视频一区二区免费在线观看| 午夜欧美不卡精品aaaaa| 国产欧美精品日韩区二区麻豆天美| 亚洲专区一二三| 久久蜜臀精品av| 亚洲精品国产视频| 欧美日韩一区综合| 欧美一区三区二区在线观看| 蜜桃久久精品一区二区| 99riav1国产精品视频| 国产精品久久久久久久久婷婷 | 久久综合久久综合久久综合| 欧美激情中文字幕一区二区 | 亚洲精品在线观看视频| 欧美性片在线观看| 久久九九精品99国产精品| 欧美韩日精品| 午夜在线观看免费一区| 亚洲国产欧美在线| 国产精品欧美风情| 久久亚洲午夜电影| 在线亚洲一区观看| 欧美大片免费观看| 欧美一级欧美一级在线播放| 亚洲第一搞黄网站| 国产精品久久久久久五月尺| 久久亚洲精品网站| 亚洲一区二区高清| 亚洲第一视频| 久久精品理论片| 在线综合欧美| 亚洲激情在线播放| 欧美国产日韩精品免费观看| 午夜精品久久久久久久久久久久久| 黑人操亚洲美女惩罚| 欧美精品一区二区视频 | 欧美不卡视频一区发布| 亚洲欧美在线免费| 亚洲人成网站999久久久综合| 国产精品视频精品| 欧美理论大片| 欧美/亚洲一区| 久久国产精品一区二区三区| 99精品国产在热久久| 欧美本精品男人aⅴ天堂| 久久国产精品99精品国产| 国产精品99久久久久久白浆小说 | 洋洋av久久久久久久一区| 亚洲第一精品夜夜躁人人爽| 国产欧美精品一区二区色综合| 欧美理论在线播放| 欧美电影在线观看完整版| 久久久99爱| 久久精品国产一区二区三区| 亚洲综合色激情五月| 亚洲一区二区精品视频| 一区二区三区欧美成人| 99国产精品99久久久久久| 91久久久久久久久久久久久| 欧美大片免费观看在线观看网站推荐| 久久久九九九九| 久久精品1区| 久久久久久网| 久久夜色精品亚洲噜噜国产mv| 久久爱www久久做| 欧美一区二区三区婷婷月色 | 亚洲尤物精选| 欧美在线免费视屏| 久久精品五月婷婷| 美女日韩在线中文字幕| 欧美成人影音| 亚洲伦伦在线| 中文在线不卡视频| 亚洲免费婷婷| 久久精品国产在热久久| 久久精品国产欧美激情 | 国产精品99久久久久久宅男| 亚洲天堂视频在线观看| 亚洲欧美一级二级三级| 亚洲欧美视频在线观看视频| 久久精品国产v日韩v亚洲 | 一区二区三区日韩| 午夜视频精品| 久久久欧美一区二区| 欧美国产一区二区三区激情无套| 欧美人与性动交cc0o| 国产精品爱啪在线线免费观看| 国产日韩欧美在线播放| 雨宫琴音一区二区在线| 亚洲免费精彩视频| 欧美中文字幕在线播放| 农夫在线精品视频免费观看| 日韩一级片网址| 欧美一区二区三区免费视| 久久看片网站| 欧美系列电影免费观看| 国内精品久久久久久久影视麻豆| 亚洲精品久久久久久久久| 亚洲一区二区三区乱码aⅴ| 久久天天躁狠狠躁夜夜av| 亚洲国产精品一区| 亚洲欧美一区二区三区在线| 免费的成人av| 国产精品尤物| av成人免费在线| 麻豆91精品91久久久的内涵| 久久久久一区二区| 久久久国产精品一区二区中文| 午夜在线精品偷拍| 亚洲国产成人tv| 西西人体一区二区| 欧美日韩午夜精品| 在线电影一区| 欧美在线啊v一区| 亚洲国产另类久久精品| 欧美一区二区三区男人的天堂 | 欧美14一18处毛片| 国产亚洲欧洲| 亚洲一区二区三区在线| 亚洲二区在线观看| 久久久久久有精品国产| 国产欧美亚洲精品| 亚洲综合久久久久| 日韩一级不卡| 欧美日韩精品高清|