快捷搜索:  xxx  as  推理研究所  幼幼  侦探研究所

马来西亚云顶集团官方网站:最简单的foreach实现(VC amp GCC)



foreach听说已经进了新的C++标准,不过在没有编译器支持曩昔,自己写一个也很轻易。

(1)   foreach 标准用法:

std::vector vec;

foreach(int i,  vec) {

st马来西亚云顶集团官方网站d::cout

(2)VC实现

在最新的VC版本华夏本已经有了类似于foreach的支持,改个名字就行了:

#define foreach(var, container)   for each(var in co马来西亚云顶集团官方网站ntainter)

(3)GCC实现

GCC没有内嵌支持,不过因为GCC支持typeof关键字, 以是实现起来也不是太难.  (有个bug, 在OwnWaterloo提醒下已经矫正)

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

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

您可能还会对下面的文章感兴趣: