HardBirch

在C++中实现foreach循环

时间:10-01-10 栏目:系统技术篇 作者:鲁智森也有文化 评论:0 点击: 2,275 次

    使用过C#、PHP这些更高级语言的朋友一定知道foreach循环。foreach语句给编程带来了很大的方
便,减少了代码,并增加了程序的可读性。C++虽然不支持foreach关键字,
但C++是一门强大的语言,只要稍微用一点小技巧,也可以在C++中使用foreach循环。
在C#中,foreach语句的效果让人吃惊。foreach语句省去了复杂而又类似的循环控制语句,使代码非常简洁明了。下面的例子可以清楚地看到这一点。
 
假有一个类型为ContainerType类型的容器Container,它的每个元素的类型为ElementType。
在C#中,数组就是这样一种容器。
在C++中,stl的vector、map等也是这样的容器。
如果要遍历容器Container的每个元素,在C#中可以使用如下代码:
foreach
( ElementType element 
in
 Container)

//
 使用element访问该元素
}
而在C++中,通常的代码都会是这样:
Container::iterator iter;
for
 (iter 
=
 Container.begin(); iter
!=
Container.end(); iter
++
)

//
 使用(*iter)访问该元素
}
显然C#中的代码更清晰的多。而C++的代码中包含了变量声明和循环控制,显得更复杂了。也许您对这一点增加的复杂性并不在意,但本着勿因善小而不为的原则,以及一点思考精神,我决定让C++也拥有使用foreach循环的能力。
 
C++的宏很适合做这种事情。问题在于如何做的更像C#中的那种样式。如果在访问元素的代码块的前面和后面各加一个宏,那么这件事情就变得毫无意义,并很可笑。
 
我们只能使用一个宏,并命名为foreach。在这个
宏后面的代码块将可以像在C#中那样可以使用一个变量名来遍历容器中的所有元素。宏中声明的变量不能污染到程序中其它部分的命名间,而这些变量又不在访问
元素的代码块中声明。这样的要求使这个问题变成一种考验代码技巧的有趣问题。
 
C++语言控制能力的强大使它确实可以支持foreach语句。这要用到两个技巧:1,for循环的第一条语句可以声明局部变量;2,充分利用for循环的过程控制能力。
 
C++中的foreach语句定义宏如下:
 

#define foreach(elementType, element, containerType, container) /
    

for
 (containerType::iterator iter 
=
 container.
begin
(); iter 
!=
 container.
end
(); iter
++
)/
        

for
 (bool 
go
 
=
 true; 
go
;) /
            

for
 (elementType 
&
 element 
=
 
*
iter;
go

go
=
false)

宏中定义了三重for循环。第一重的意义很清楚:使用容器的遍历者遍历容器中的元素。第二、第三重for循环其实只能执行一次,其主要目的是声明element变量。C++的变量引用类型使后面的元素访问代码块可以直接使用element变量。
 
foreach
宏的参数依次为:元素类型,元素名,容器类型,容器名。
 
假设有个vector如下面的定义:
vector<int
> v;
 
那么遍历v可以使用下面的代码:
foreach(int
, e, vector<int
>, v)
{//
使用(e)来访问v的元素
}
 
是不是很像C#中的foreach语句呢?我写了一小段程序,看看这个宏是不是真的能工作,代码如下:
#include
<iostream>
#include
<vector>
using
namespace
std;

 
//
在C++中使用 foreach 循环
#define
foreach(elementType, element, containerType, container) /
    for
(containerType::iterator iter = container.begin(); iter != container.end(); iter++)/

       for
(bool
go = true
; go;)/

           for
(elementType & element = *iter;go; go=false
)

 
int
main()
{
    vector<int
> v;

    for
(int
i=0; i<10; ++i)

       v.push_back(i);
    foreach(int
, e, vector<int
>, v) //
在这里使用foreach
语句



    {
       printf("%d/n", e);
    }
}
 
结果输出很正确!
 
事实上,在C++中,for语句以及其它语句,它们的本质是基于计算机指令的过程控制语句,而C#中的foreach语句,可以看作是基遍历者这种设计模式的语句。编程语言从只基于计算机指令到基于设计模式,这应该也算是软件发展的进步吧。
 
在C++中使用文中定义的foreach语句并不能提高程序的效率,也不会明显降低效率。foreach宏只能在代码层面上有些好处,减少一些重复的代码,增加一点可读性。设计这个宏,就当是个趣味技巧题,玩一玩,并支持一下那些坚决拥抱C++的朋友们。
 
作者:苏林

声明: 本文由( 鲁智森也有文化 )原创编译,转载请保留链接: 在C++中实现foreach循环

在C++中实现foreach循环:目前有

  1. 板凳
    匿名用户:

    [e06]

    2010-03-18 10:34 [回复]
  2. 沙发
    do2jiang:

    回复 匿名用户:[e07]

    2010-03-18 18:55 [回复]

发表评论


QQ群互动

Linux系统与内核学习群:194051772

WP建站技术学习交流群:194062106

魔豆之路QR

魔豆的Linux内核之路

魔豆的Linux内核之路

优秀工程师当看优秀书籍

优秀程序员,要看优秀书!

赞助商广告

友荐云推荐