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

eXile 的專欄

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

     foreach據說已經進了新的C++標準,不過在沒有編譯器支持以前,自己寫一個也很容易。

(1)   foreach 標準用法: 

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


     
    (2)VC實現

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

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

   
    (3)GCC實現

    GCC沒有內嵌支持,不過由于GCC支持typeof關鍵字, 所以實現起來也不是太難.  (有個bug, 在OwnWaterloo提醒下已經糾正)
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有可能是一個臨時對象,或者是某個函數的返回值。為了不對容器進行復制,利用了一個不太為人所知的C++特性,就是臨時變量在存在引用時,生命期會由引用變量決定。這樣保證在進行循環時始終有效。
   
   (4)性能

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

    本文由eXile 原創,轉載請表明原貼地址。 http://www.shnenglu.com/eXile/

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

評論

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

用BOOST_FOREACH更好點,使用的是ISO標準C++。VC那是CLI擴展,非ISO標準.  回復  更多評論   

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

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


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


-------- -------- 分割線 -------- --------
是否可以考慮這樣修改?
#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的生命周期了。  回復  更多評論   

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

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

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

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

  回復  更多評論   

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

用宏實現的話,其類型不安全。
在STL中已經有了for_each,肯定比自己實現的要高效。  回復  更多評論   

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

lambda 才是王道啊,嘎嘎。  回復  更多評論   

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

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

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

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

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

@空明流轉
確實,沒有lambda之前,for_each沒什么意思。不過好消息是VC2010將會支持lambda.  回復  更多評論   

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

@螞蟻終結者
BOOST_FOREACH 的那陀實現。。。還是算了吧  回復  更多評論   

導航

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

統計

常用鏈接

留言簿(18)

隨筆分類

隨筆檔案

服務器編程

搜索

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美日韩美女在线| 亚洲国产精品热久久| 亚洲素人在线| 亚洲精品日韩激情在线电影 | 久久美女艺术照精彩视频福利播放| 日韩小视频在线观看| 欧美四级在线观看| 久久精品国产欧美激情| 久久久精品日韩欧美| 亚洲人成小说网站色在线| 亚洲国产精品精华液2区45| 欧美日韩免费在线| 欧美综合77777色婷婷| 久久人体大胆视频| 亚洲自拍偷拍网址| 久久精品国产亚洲一区二区三区| 亚洲精品免费电影| 亚洲一区三区在线观看| 一区二区三区中文在线观看| 亚洲第一精品久久忘忧草社区| 欧美日本成人| 久久综合图片| 欧美日韩国产一区二区三区地区 | 亚洲国产欧美日韩精品| 国产精品久久综合| 亚洲成色最大综合在线| 国产精品久久久久久久久免费| 老司机一区二区| 欧美视频中文字幕| 欧美国产一区二区三区激情无套| 欧美性猛片xxxx免费看久爱| 欧美福利电影网| 国产午夜亚洲精品羞羞网站 | 欧美日韩久久不卡| 性色av一区二区三区红粉影视| 久久免费视频在线观看| 午夜精品亚洲一区二区三区嫩草| 免费不卡视频| 久久久xxx| 国产精品美女久久久| 亚洲风情在线资源站| 国产欧美视频一区二区三区| 亚洲区中文字幕| 欲色影视综合吧| 午夜伦欧美伦电影理论片| aaa亚洲精品一二三区| 久久人人97超碰精品888| 久久国产主播| 国产精品一区一区| 日韩天天综合| 99精品国产在热久久| 免费观看在线综合| 免费不卡在线观看av| 国产一区二区三区视频在线观看| 中文国产一区| 亚洲小说欧美另类社区| 欧美日韩免费观看一区二区三区| 亚洲动漫精品| 亚洲精品国产品国语在线app| 久久蜜臀精品av| 美女免费视频一区| 久久gogo国模啪啪人体图| 午夜精品影院| 国产日韩亚洲| 欧美一区二区私人影院日本| 欧美亚洲视频| 国产伦精品一区二区三区视频孕妇| 一区二区三区精品视频在线观看| 一区二区国产精品| 欧美亚洲第一区| 亚洲一区二区三区视频播放| 亚洲在线中文字幕| 国产精品青草综合久久久久99| 亚洲欧美日韩中文播放| 久久成人精品视频| 悠悠资源网久久精品| 欧美va天堂在线| 99在线精品观看| 久久国产乱子精品免费女 | 国产精品视频免费观看| 亚洲欧洲av一区二区| 久久精品一区中文字幕| 一色屋精品亚洲香蕉网站| 麻豆9191精品国产| 亚洲精品色婷婷福利天堂| 亚洲欧美日韩直播| 激情婷婷亚洲| 欧美日韩免费观看中文| 亚洲欧美一区在线| 欧美sm视频| 亚洲男人第一网站| 国内成+人亚洲| 欧美另类videos死尸| 亚洲永久在线| 欧美肥婆在线| 久久er99精品| 亚洲精品欧美日韩| 国产精品久久中文| 免费短视频成人日韩| 亚洲尤物精选| 亚洲欧洲在线看| 久久亚洲国产精品日日av夜夜| 亚洲免费观看高清完整版在线观看熊 | 一本色道久久88综合日韩精品| 国产精品v欧美精品∨日韩| 久久精品国产99国产精品澳门| 亚洲国产裸拍裸体视频在线观看乱了中文 | 欧美日本视频在线| 久久av免费一区| 在线一区二区日韩| 亚洲国产91| 久久久久久亚洲精品中文字幕| 夜夜嗨av一区二区三区中文字幕 | 欧美专区日韩专区| 一区二区三区视频观看| 欧美高清一区二区| 欧美一区二区女人| 亚洲一区二区三区777| 亚洲经典一区| 在线日韩av| 久久久一区二区| 亚洲专区在线视频| 日韩一级不卡| 91久久中文| 欧美激情综合色| 浪潮色综合久久天堂| 性做久久久久久久免费看| 一区二区激情| 亚洲毛片一区| 日韩视频专区| 亚洲人在线视频| 亚洲国产精品久久精品怡红院| 国产在线不卡视频| 国产视频一区在线观看| 国产精品日韩在线观看| 国产精品mm| 国产精品久久久久久久久借妻| 欧美另类亚洲| 欧美日韩免费观看中文| 欧美婷婷在线| 国产精品久久午夜夜伦鲁鲁| 国产精品国产三级欧美二区| 欧美日韩中字| 国产伦一区二区三区色一情| 国产精品网站在线播放| 国产美女精品免费电影| 国产深夜精品| 韩日在线一区| 极品少妇一区二区三区精品视频| 国产一区二区三区在线观看免费视频| 国产精品一区二区你懂得| 国产欧美va欧美va香蕉在| 国产日韩欧美在线观看| 韩日精品视频| 亚洲欧洲精品一区二区三区不卡 | 亚洲精品一区二区三区樱花| 亚洲美女av网站| 亚洲视频一区| 欧美一级欧美一级在线播放| 欧美在线免费看| 蜜桃av噜噜一区| 欧美日本一道本在线视频| 国产精品久久久久av| 韩国av一区二区三区| 亚洲日韩成人| 羞羞视频在线观看欧美| 久久综合导航| 亚洲精品孕妇| 欧美亚洲专区| 免费亚洲网站| 国产精品综合不卡av| 亚洲第一精品夜夜躁人人爽| 夜夜嗨av色综合久久久综合网| 亚洲欧美日韩一区| 免费观看成人www动漫视频| 亚洲伦理网站| 久久精品国产成人| 欧美日韩亚洲一区二区| 国产一区清纯| 在线视频一区观看| 麻豆精品在线视频| 宅男精品视频| 嫩草国产精品入口| 国产精品一区二区在线| 亚洲日本电影| 久久精品视频免费观看| 亚洲精品乱码视频| 久久久久一区二区三区| 国产精品国产自产拍高清av| 91久久亚洲| 久久精品人人做人人爽| 夜夜嗨av色一区二区不卡| 久久久精品性| 国产欧美精品日韩| 一本色道久久综合亚洲精品小说| 久久久久久夜精品精品免费| 一区二区三区视频在线| 欧美日韩不卡视频| 亚洲人成人一区二区三区| 久久久久久91香蕉国产|