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

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 閱讀(3907) 評論(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 的那陀實現。。。還是算了吧  回復  更多評論   

導航

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

統計

常用鏈接

留言簿(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>
            亚洲婷婷国产精品电影人久久| 久久蜜桃香蕉精品一区二区三区| 欧美激情精品久久久久久久变态| 久久精品成人一区二区三区| 欧美制服第一页| 久久精品亚洲精品| 麻豆九一精品爱看视频在线观看免费| 美女精品一区| 日韩一区二区福利| 久久成年人视频| 欧美精品1区2区| 国产老女人精品毛片久久| 激情91久久| 亚洲一区二区在线免费观看| 久久久久久久尹人综合网亚洲| 免费久久99精品国产| 亚洲精品黄网在线观看| 亚洲专区国产精品| 欧美99久久| 国产色产综合色产在线视频| 日韩一本二本av| 久久伊人一区二区| 亚洲一二三区在线观看| 美女性感视频久久久| 国产精品影片在线观看| 亚洲精品一二区| 久久永久免费| 欧美一区二区视频在线观看2020| 欧美激情中文字幕一区二区| 曰韩精品一区二区| 久久激情综合| 欧美一区国产一区| 国产九区一区在线| 欧美一区在线视频| 亚洲性视频网址| 国产精品日本精品| 亚洲尤物影院| 亚洲婷婷综合色高清在线 | 欧美伊人精品成人久久综合97| 国产精品初高中精品久久| 日韩一级片网址| 亚洲国产精品第一区二区| 蜜臀久久久99精品久久久久久 | 久久这里有精品15一区二区三区| 久久久99精品免费观看不卡| 欧美成人第一页| 国产精品日韩高清| 国产精品青草久久| 一本大道久久a久久精品综合| 国产精品免费网站| 欧美主播一区二区三区| 午夜性色一区二区三区免费视频 | 国产精品国产三级国产专区53| 亚洲三级性片| 一区二区三区视频在线观看| 欧美图区在线视频| 欧美一区影院| 久久乐国产精品| 亚洲国产91精品在线观看| 亚洲人在线视频| 国产欧美一区二区三区沐欲| 先锋影院在线亚洲| 裸体一区二区| 午夜精品在线观看| 欧美国产三区| 久久伊人精品天天| 国产精品久久久久久久午夜| 女仆av观看一区| 国产女人水真多18毛片18精品视频 | 欧美伊人久久久久久久久影院| 久久国产毛片| 欧美在线你懂的| 欧美天堂在线观看| 亚洲国产精品久久91精品| 国产视频不卡| 亚洲欧美一级二级三级| 在线亚洲一区二区| 噜噜噜91成人网| 麻豆精品视频| 狠久久av成人天堂| 久久av最新网址| 久久久精品午夜少妇| 国产精品看片资源| 99视频精品免费观看| 一区二区三区成人精品| 欧美精品在线一区二区| 免费久久99精品国产| 精品99一区二区三区| 久久成人免费视频| 免费视频一区| 91久久夜色精品国产九色| 欧美成人日韩| 亚洲精品在线视频观看| 亚洲夜间福利| 国产午夜一区二区三区| 久久久久久久综合日本| 亚洲激情网址| 午夜精品在线看| 欧美网站大全在线观看| 亚洲黄页视频免费观看| 亚洲欧美综合| 亚洲激情欧美| 国产一区二区成人| 欧美成人高清| 欧美一区二区三区在线播放| 亚洲第一天堂av| 久久国内精品自在自线400部| 在线日韩一区二区| 国产日韩在线亚洲字幕中文| 欧美va亚洲va香蕉在线| 欧美一区亚洲| 99re这里只有精品6| 欧美国产乱视频| 欧美在线亚洲综合一区| 亚洲午夜精品久久| 亚洲精品永久免费精品| 在线观看一区视频| 国模 一区 二区 三区| 国产精品久久久久久久久久久久| 欧美天堂亚洲电影院在线观看| 欧美一区二区三区免费看 | 今天的高清视频免费播放成人 | 久久久亚洲成人| 亚洲先锋成人| 一本色道久久88综合亚洲精品ⅰ| 国产专区欧美精品| 国产精品香蕉在线观看| 欧美韩日精品| 欧美不卡一区| 欧美精品乱码久久久久久按摩| 午夜精品免费在线| 日韩亚洲一区在线播放| 亚洲精品九九| 99热精品在线| 亚洲一区二区视频| 亚洲一区二区在| 亚洲女人av| 亚洲欧美在线高清| 欧美一区二区在线视频| 小嫩嫩精品导航| 久久九九久精品国产免费直播| 午夜精品视频| 久久免费视频观看| 欧美日韩国产页| 国产日韩综合| 亚洲精品影视在线观看| 亚洲美女在线看| 欧美在线观看日本一区| 欧美激情亚洲| 亚洲新中文字幕| 麻豆freexxxx性91精品| 欧美视频一二三区| 国产区欧美区日韩区| 亚洲美女黄色| 麻豆国产精品777777在线| 日韩视频―中文字幕| 久久超碰97人人做人人爱| 欧美激情在线狂野欧美精品| 国产亚洲一区二区三区| 亚洲日韩欧美视频一区| 欧美一区2区三区4区公司二百| 亚洲第一黄网| 老司机免费视频一区二区三区 | 久久久国产成人精品| 亚洲精品中文在线| 欧美一进一出视频| 国产精品v欧美精品v日韩 | 国产精品美女久久久| 日韩天堂在线视频| 欧美国产先锋| 久久精品123| 狠狠狠色丁香婷婷综合激情| 久久国产精品99精品国产| 亚洲午夜免费视频| 国产精品高清一区二区三区| 99这里有精品| 亚洲天堂网在线观看| 国产精品久久久久久久久久免费| 亚洲天堂av在线免费| 亚洲最新色图| 国产亚洲欧洲一区高清在线观看| 香蕉精品999视频一区二区| 亚洲乱码日产精品bd| 欧美破处大片在线视频| 一区二区三区精品| 国产精品99久久久久久白浆小说| 国产精品看片资源| 久久国产综合精品| 欧美成人国产| 亚洲免费观看| 亚洲欧美资源在线| 一区二区视频免费完整版观看| 免费观看30秒视频久久| 免费成人av在线| 香蕉久久夜色精品国产| 久久香蕉国产线看观看网| 一区二区av在线| 久久久久成人网| 亚洲视频福利| 久久久人成影片一区二区三区|