最简单的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关键字, 所以实现起来也不是太难

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)    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 (用个具有中国特色的结论,就是大约要好五倍),我的测试当然很粗略,不值得相信。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值