WEB开发网
开发学院软件开发VC 最简单的foreach实现(VC & GCC) 阅读

最简单的foreach实现(VC & GCC)

 2010-09-04 20:47:58 来源:WEB开发网   
核心提示:foreach据说已经进了新的C++标准,不过在没有编译器支持以前,最简单的foreach实现(VC & GCC),自己写一个也很容易,(1)foreach 标准用法:std::vector<int>vec;foreach(inti, vec){std::cout << i;}(2)VC

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

Tags:简单 foreach 实现

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接