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

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://m.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>
            亚洲一区二区三区四区五区黄| 国产精品超碰97尤物18| 欧美国产精品| 欧美顶级大胆免费视频| 欧美sm重口味系列视频在线观看| 久久精品国产2020观看福利| 久久av二区| 久久福利精品| 久久综合伊人77777麻豆| 你懂的成人av| 最近看过的日韩成人| 日韩一二三区视频| 午夜精品久久久久影视| 久久久精品五月天| 欧美精品 日韩| 国产精品国产三级国产aⅴ9色| 国产精品试看| 亚洲高清不卡一区| 亚洲在线日韩| 裸体丰满少妇做受久久99精品| 最新亚洲电影| 欧美一区二区三区视频免费| 欧美成人精品在线观看| 国产精品毛片在线看| 在线精品视频一区二区| 中国成人在线视频| 久久夜色精品国产噜噜av| 亚洲国产专区| 久久精品视频va| 国产精品美女久久| 亚洲精品久久久久久下一站| 羞羞色国产精品| 亚洲精品欧洲| 久久亚洲一区二区| 国产精品理论片| 亚洲免费观看高清完整版在线观看| 亚洲欧美国产毛片在线| 欧美高清在线播放| 在线视频欧美日韩精品| 这里只有视频精品| 女仆av观看一区| 国产欧美一区二区色老头 | 亚洲第一精品久久忘忧草社区| 99爱精品视频| 欧美国产日韩精品免费观看| 国产欧美一二三区| 在线视频日本亚洲性| 欧美高清视频www夜色资源网| 香蕉久久夜色精品国产使用方法| 欧美精品尤物在线| 亚洲精品欧美日韩| 欧美黄色精品| 久热精品视频在线观看一区| 国产在线视频欧美| 欧美在线视频观看| 亚洲欧美激情在线视频| 国产精品久久久久久久久婷婷| 夜夜嗨av一区二区三区四区| 欧美国产日韩a欧美在线观看| 久久精品亚洲热| 国内精品久久久| 久久五月天婷婷| 久久久久久久999精品视频| 国产亚洲综合精品| 久久久欧美一区二区| 欧美亚洲综合在线| 狠狠入ady亚洲精品经典电影| 欧美在线免费视屏| 久久se精品一区二区| 一区免费观看| 女人色偷偷aa久久天堂| 麻豆精品精品国产自在97香蕉| 亚洲国产裸拍裸体视频在线观看乱了 | 美女福利精品视频| 亚洲激情在线观看| 日韩视频免费观看| 国产精品久久久久久久久果冻传媒| 亚洲午夜激情免费视频| 亚洲欧美精品在线观看| 狠狠干狠狠久久| 欧美激情精品久久久| 欧美日韩国产精品一区| 欧美一级片一区| 久久夜精品va视频免费观看| 一区二区激情小说| 午夜久久黄色| 亚洲国产综合在线| 亚洲欧美成人一区二区三区| 国产最新精品精品你懂的| 欧美激情精品久久久久久| 欧美日韩视频一区二区| 欧美影院视频| 欧美~级网站不卡| 欧美一区二区高清在线观看| 久久综合色播五月| 久久久国产精品亚洲一区 | 亚洲免费精彩视频| 国产精品五区| 欧美成人69| 国产精品午夜av在线| 欧美大片在线看| 国产精品日韩精品欧美在线| 免费观看在线综合色| 欧美色视频在线| 久久久久久九九九九| 欧美日韩福利视频| 久久一区二区三区av| 国产精品卡一卡二| 亚洲大胆美女视频| 国内外成人免费激情在线视频网站 | 国产精品久久77777| 麻豆精品视频在线观看视频| 欧美日韩直播| 欧美承认网站| 国产真实久久| 亚洲欧美日韩综合一区| 亚洲深夜福利在线| 欧美电影免费观看大全| 久久综合九色99| 国产日韩欧美在线播放| 一本大道久久a久久精二百| 亚洲欧洲精品成人久久奇米网 | 免播放器亚洲一区| 国产欧美二区| 亚洲综合第一| 亚洲女与黑人做爰| 欧美性事在线| 一本久久青青| 亚洲调教视频在线观看| 欧美日韩国产精品专区| 亚洲久色影视| 亚洲图片在线观看| 欧美日韩精品免费观看视频| 亚洲高清不卡一区| 亚洲看片一区| 欧美日韩在线播放三区四区| 亚洲免费观看高清在线观看| 亚洲精品国产日韩| 欧美激情第8页| 亚洲人成人一区二区三区| 日韩视频在线你懂得| 欧美成人a视频| 亚洲人成绝费网站色www| 亚洲理伦在线| 欧美日韩国产限制| 国产精品99久久99久久久二8| 亚洲一区二区在线观看视频| 国产精品地址| 香蕉av777xxx色综合一区| 久久久另类综合| 亚洲国产精品专区久久| 欧美精品尤物在线| 亚洲一区二区成人| 久久精品国产精品亚洲综合| 黄色一区二区在线观看| 米奇777在线欧美播放| 免费高清在线视频一区·| 欧美国产日韩亚洲一区| 亚洲日本激情| 欧美日韩xxxxx| 亚洲视频一二区| 久久免费午夜影院| 亚洲人成77777在线观看网| 欧美日韩在线第一页| 亚洲午夜精品一区二区三区他趣| 欧美在线不卡视频| 最新国产成人av网站网址麻豆| 欧美日韩不卡| 性亚洲最疯狂xxxx高清| 欧美激情aaaa| 亚洲欧美日韩国产成人| 一区二区视频免费完整版观看| 欧美大片一区二区三区| 亚洲视频欧洲视频| 欧美大片91| 欧美一区二区在线免费播放| 亚洲人成网站精品片在线观看| 国产精品―色哟哟| 欧美国产国产综合| 午夜一级久久| 亚洲精品一区在线| 久久综合狠狠综合久久综青草| 亚洲视频一区在线观看| **性色生活片久久毛片| 国产精品日韩欧美| 欧美成人一品| 久久精品一级爱片| 亚洲图片自拍偷拍| 亚洲人成网站777色婷婷| 久久在线免费| 欧美在线一二三区| 亚洲视频导航| 亚洲精品日韩在线观看| 国内免费精品永久在线视频| 国产精品99免视看9| 欧美精品国产精品日韩精品| 久久久久综合网| 久久福利资源站| 亚久久调教视频| 亚洲欧美日韩精品久久久|