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

eXile 的專欄

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

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

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

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


     
    (2)VC實現(xiàn)

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

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

   
    (3)GCC實現(xiàn)

    GCC沒有內(nèi)嵌支持,不過由于GCC支持typeof關(guān)鍵字, 所以實現(xiàn)起來也不是太難.  (有個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;}))

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

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

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

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

評論

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

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

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

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


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


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

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

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

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


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

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

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

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

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

  回復(fù)  更多評論   

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

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

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

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

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

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

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

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

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

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

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

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

導(dǎo)航

<2025年11月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456

統(tǒng)計

常用鏈接

留言簿(18)

隨筆分類

隨筆檔案

服務(wù)器編程

搜索

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲精品欧洲精品| 国产精品美女视频网站| 国产欧美一区二区精品婷婷| 亚洲综合精品四区| 亚洲午夜电影网| 国产九区一区在线| 久久av一区二区三区亚洲| 久久国产精品毛片| 亚洲国产裸拍裸体视频在线观看乱了中文 | 亚洲第一精品夜夜躁人人爽| 久久久久久久久久久一区| 亚洲二区在线视频| 亚洲精品字幕| 国产欧美日韩免费| 欧美激情成人在线视频| 欧美日韩一区二区在线视频| 欧美一区二区三区视频免费| 久久综合给合| 亚洲尤物精选| 久久激情五月激情| 亚洲日本va在线观看| 在线亚洲免费| 亚洲电影免费观看高清完整版| 亚洲人体大胆视频| 国产一区二区三区四区老人| 亚洲国产成人在线视频| 国产精品欧美经典| 欧美国产精品日韩| 国产精品推荐精品| 亚洲国产天堂久久综合网| 国产精品视频免费在线观看| 嫩模写真一区二区三区三州| 欧美三区美女| 噜噜噜91成人网| 国产精品久久9| 亚洲国产高清在线观看视频| 国产日产高清欧美一区二区三区| 亚洲国产成人在线视频| 国产亚洲欧美色| 一区二区三区不卡视频在线观看| 在线观看视频亚洲| 欧美一区二区三区在线看| 中文av一区二区| 欧美高清一区| 欧美1区2区| 国产欧美日韩91| a4yy欧美一区二区三区| 亚洲黄色在线看| 久久久久久久91| 久久久久久久激情视频| 国产精品久久久久久亚洲调教 | 欧美中文字幕精品| 欧美日韩综合网| 亚洲国产精品电影在线观看| 黄色成人在线免费| 性欧美长视频| 亚洲欧美影音先锋| 国产精品r级在线| 91久久久久久久久| 精品91久久久久| 久久成人18免费网站| 久久精品2019中文字幕| 国产精品一香蕉国产线看观看| 99精品欧美一区二区三区综合在线| 亚洲精品欧洲| 欧美日韩ab| 亚洲区欧美区| 亚洲毛片在线看| 欧美日本韩国在线| 91久久国产自产拍夜夜嗨| 亚洲精品中文在线| 欧美大片在线看免费观看| 亚洲国产精品久久久| 亚洲精品国产视频| 欧美日韩黄色大片| 亚洲九九爱视频| 一区二区三区四区国产| 国产精品久久久久aaaa| 午夜亚洲影视| 麻豆乱码国产一区二区三区| 亚洲第一搞黄网站| 你懂的视频一区二区| 欧美国产日本在线| 亚洲精品在线免费| 欧美视频在线播放| 亚洲免费一在线| 久久久久久夜精品精品免费| 精品动漫3d一区二区三区| 免费国产自线拍一欧美视频| 亚洲精品免费观看| 欧美一区二区视频在线| 激情成人av在线| 欧美精品18+| 亚洲欧美久久久| 欧美不卡在线| 中日韩在线视频| 国产午夜精品一区二区三区欧美 | 国产精品多人| 欧美在线视频一区二区三区| 老司机精品导航| 一本色道**综合亚洲精品蜜桃冫| 国产精品久久久久久久久久直播| 欧美在线免费视屏| 另类av一区二区| 亚洲美女免费精品视频在线观看| 国产精品日韩在线一区| 久久久国产亚洲精品| 亚洲精品免费网站| 久久婷婷一区| 亚洲专区一区二区三区| 在线观看欧美视频| 国产精品第13页| 奶水喷射视频一区| 亚洲欧美日韩综合一区| 亚洲精品久久久蜜桃 | 亚洲啪啪91| 国产精品免费看久久久香蕉| 久久精品日韩| 亚洲靠逼com| 欧美国产一区二区在线观看| 午夜精品999| 中文在线不卡视频| 亚洲精品在线视频| 一区二区亚洲| 国产亚洲欧美日韩一区二区| 国产精品av一区二区| 欧美福利视频在线观看| 久久精品论坛| 午夜精品久久久久久久久 | 欧美一区二区黄| 99视频精品免费观看| 亚洲人成毛片在线播放女女| 狠狠色丁香婷婷综合| 国产一区二区三区高清在线观看 | 国产精品久久久一区麻豆最新章节 | 欧美在线综合| 性做久久久久久| 在线一区二区三区四区五区| 亚洲理伦电影| 亚洲精品日韩激情在线电影| 亚洲国产欧洲综合997久久| 久久综合伊人77777| 久久国产精品久久w女人spa| 午夜精品一区二区三区在线视| 亚洲一区激情| 欧美亚洲视频在线观看| 亚洲欧美怡红院| 久久精品国产69国产精品亚洲| 欧美在线你懂的| 久久久久免费视频| 久久久久久久精| 欧美成在线观看| 亚洲人成欧美中文字幕| 99精品国产在热久久| 亚洲网址在线| 久久国产一区| 欧美r片在线| 欧美乱妇高清无乱码| 国产精品大全| 国产综合色产| 亚洲日本欧美日韩高观看| 夜夜嗨av一区二区三区中文字幕 | 免费亚洲电影在线观看| 欧美国产日韩a欧美在线观看| 欧美不卡三区| 一区二区三区欧美视频| 午夜精品久久久久影视 | 欧美一区二区三区免费视| 久久激情综合网| 欧美精品大片| 国产女人水真多18毛片18精品视频| 国产亚洲欧美一区| 亚洲精品视频啊美女在线直播| 一区二区三区精品视频| 久久精品91| 91久久综合| 午夜激情亚洲| 欧美大片在线看| 国产毛片精品视频| 亚洲国产欧美在线| 亚洲欧美国产精品va在线观看| 久久九九精品| 亚洲精品欧美一区二区三区| 久久xxxx精品视频| 欧美日韩一区二区视频在线| 国产小视频国产精品| 亚洲精品一区二区三区99| 欧美一区二区高清在线观看| 亚洲大片av| 香蕉乱码成人久久天堂爱免费| 欧美激情一区三区| 国语精品一区| 翔田千里一区二区| 亚洲精品国产精品国自产观看| 欧美在线视频观看免费网站| 欧美久久成人| 亚洲日本中文字幕| 久久亚洲综合网| 亚洲欧美中文另类| 欧美午夜视频在线|