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

时间: 2024-10-03 14:47:28

最简单的foreach实现(VC &amp; GCC)的相关文章

共享变量在VC和GCC编译器下的不同表示方法

#include <stdio.h> // VC6 版本 #pragma comment(linker, "/SECTION:.text,RWS") // 创建自定义的 shared Section #pragma data_seg(".text") int g_iShared = 0x37; #pragma data_seg() // int g_iShared __attribute__ ((section(".text")))

[C/C++] 各种C/C++编译器对UTF-8源码文件的兼容性测试(VC、GCC、BCB)

在不同平台上开发C/C++程序时,为了避免源码文件乱码,得采用UTF-8编码来存储源码文件.但是很多编译器对UTF-8源码文件兼容性不佳,于是我做了一些测试,分析了最佳保存方案. 一.测试程序 为了测试编译器对UTF-8源码文件兼容性,我编写了这样的一个测试程序-- //#if _MSC_VER >= 1600 // VC2010 //#pragma execution_character_set("utf-8") //#endif #include <stdio.h>

一段简单的程序在VC 6.0中编译运行得到 正确的 结果,但是在VS2005.net中编译通过 却得不到正确的 结果!!!!!!

问题描述 一段程序,就是为了读出D:\excludeGroup文件的每一行,并显示在控制台上,在VC6.0中编译得到的运行文件,可以读出excludeGroup文件中的每一行,但是VS2005.net中编译的程序,却打不开文件,这是为什么呢.难道STL在VS2005.net需要设置什么特别的参数吗,请高手赐教!#include"stdafx.h"#include<string>#include<iostream>#include<fstream>us

VC++实现选择排序算法简单示例_C 语言

本文以一个非常简单的实例说明VC++选择排序算法的实现方法,对n个记录进行n-1趟简单选择排序,在无序区中选取最小记录. 具体实现代码如下: #include<iostream> using namespace std; //简单选择排序 void SelectSort(int r[ ], int n) { int i; int j; int index; int temp; for (i=0; i<n-1; i++) //对n个记录进行n-1趟简单选择排序 { index=i; for

简单Velocity实践

Velocity是一种模板语言,它的作用.好处等可以找到很多资料,下面我们分二次来进行简单实践,第一部份是hello world .看我做完这个实验,你就知道,初步上手其实是一件简单的事情:) 1. 建立模板文件 hello.vm,简单些,全文如下: Hello, $name 2. 建立Class文件: import java.io.BufferedWriter; import java.io.OutputStreamWriter; <?xml:namespace prefix = o ns =

深入浅出VC++串口编程之第三方类

串口类 从本系列文章可以看出,与通过WIN32 API进行串口访问相比,通过MScomm这个Activex控 件进行串口访问要来的方便许多,它基本上可以向用户屏蔽多线程的细节,以事件(发出 OnComm消息)方式实现串口的异步访问. 尽管如此,MScomm控件的使用仍有诸多不便,譬如其发送和接收数据都要进行VARIANT类 型对象与字符串的转化等.因此,国内外许多优秀的程序员自己编写了一些串口类,使用这 些类,我们将可以更方便的操作串口.在笔者的<深入浅出Win32多线程程序设计之综合实例 >

PHP中foreach()用法汇总

  这篇文章主要给大家详细介绍了PHP中foreach()用法以及相关的示例,十分的细致,有需要的小伙伴可以参考下. PHP 4 引入了 foreach 结构,和 Perl 以及其他语言很像.这只是一种遍历数组简便方法.foreach 仅能用于数组,当试图将其用于其它数据类型或者一个未初始化的变量时会产生错误.有两种语法,第二种比较次要但却是第一种的有用的扩展. ? 1 2 3 4 5foreach (array_expression as $value) statement foreach (

CentOS如何查看当前系统下的gcc版本命令?

  CentOS如何查看当前系统下的gcc版本命令?          1. gcc -v(Display the programs invoked by the compiler) [root@localhost /]# gcc -v Reading specs from /usr/i386-glibc-2.1-linux/lib/gcc-lib/i386-glibc21-linux/egcs-2.91.66/specs gcc version egcs-2.91.66 19990314/Li

PHP中foreach()用法汇总_php技巧

PHP 4 引入了 foreach 结构,和 Perl 以及其他语言很像.这只是一种遍历数组简便方法.foreach 仅能用于数组,当试图将其用于其它数据类型或者一个未初始化的变量时会产生错误.有两种语法,第二种比较次要但却是第一种的有用的扩展. foreach (array_expression as $value) statement foreach (array_expression as $key => $value) statement 第一种格式遍历给定的 array_express