首页
社区
课程
招聘
[讨论]一道给C++高级程序员的题————写FOREACH
发表于: 2011-1-7 13:06 11514

[讨论]一道给C++高级程序员的题————写FOREACH

2011-1-7 13:06
11514

一道给C++高级程序员的题————写FOREACH

我们知道,std::for_each是极难用的。要指定开始位置,还要指定结束位置,要做的事还必须写成一个函数。如果可以这么使用就方便多了:

void test()
{
    const char * hello = "hello, world\n";
   
    FOREACH( char ch, hello )
    {
        std::cout << ch;
    }

    int tbl[5] = {1,2,3,4,5};
    FOREACH( int i, tbl )
    {
        std::cout << i << ' ';
    }
    std::cout << '\n';

    std::vector<int> m; // also support std::list, std::deque
    m.push_back(10);
    m.push_back(20);
    m.push_back(30);
    FOREACH( int i, m )
    {
        std::cout << i << ' ';
        if (i == 20) break;
    }
}

解释一下:
        * 如果给的是一个字串,计算到 '\0' 结束
        * 如果是一个数组,自动按数组大小
        * 如果是一个类似 std::vector 这样的类,有 iterator,const_iterator 类型还有 begin(), end() 方法,那么自动支持。

以上test()代码不允许做任何修改,在函数前面加C++代码来定义FOREACH,使完成需要功能,你能写出来吗?

不要说这不可能。我已经测试过的。欢迎把你的结果贴出来,我来评点最优回答!

苏州WinMount开发团队继续招C++中级程序员,高级程序员!请把简历发到 support@winmount.com


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 7
支持
分享
最新回复 (18)
雪    币: 63
活跃值: (17)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
2
#define FOREACH BOOST_FOREACH
感觉意义不大 语法糖一样的东西
2011-1-7 14:32
0
雪    币: 182
活跃值: (81)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
有问题哦,char *ch("Hello")吧
2011-1-7 14:33
0
雪    币: 468
活跃值: (340)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
4
居然没一个人肯认真做?
2011-1-9 11:17
0
雪    币: 239
活跃值: (25)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
不会做...
2011-1-9 11:19
0
雪    币: 189
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
感受到了Boost的强大!其他的都是浮云
2011-1-9 12:36
0
雪    币: 1708
活跃值: (586)
能力值: ( LV15,RANK:670 )
在线值:
发帖
回帖
粉丝
7
BOOST_FOREACH 是对的,但是在VC6下无法编译通过,宏重定义被视为错误。

#include <iostream>
#include <vector>
#include <boost/foreach.hpp>


#define FOREACH BOOST_FOREACH 

void test()
{
    const char * hello = "hello, world\n";
    
    FOREACH( char ch, hello )
    {
        std::cout << ch;
    }
	
    int tbl[5] = {1,2,3,4,5};
    FOREACH( int i, tbl )
    {
        std::cout << i << ' ';
    }
    std::cout << '\n';
	
    std::vector<int> m; // also support std::list, std::deque
    m.push_back(10);
    m.push_back(20);
    m.push_back(30);
    FOREACH( int i, m )
    {
        std::cout << i << ' ';
		if (i == 20) break;
    }
}

/*
int main(int, char **, char **)
{
	test();
	return 0;
}
*/
2011-1-9 21:12
0
雪    币: 63
活跃值: (17)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
8
- -!!!
BOOST不支持古老的VC6编译器
2011-1-11 13:05
0
雪    币: 724
活跃值: (81)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
9
BOOST已有些变态,它的BOOST_FOREACH要使用循环嵌套来实现,有多大意义呢,VC2010已支持lambda表达式,std::for_each也可以使用lambda表达式,不需要先定义函数,个人感觉这种形式更好些。
2011-1-11 15:32
0
雪    币: 1708
活跃值: (586)
能力值: ( LV15,RANK:670 )
在线值:
发帖
回帖
粉丝
10
支持的,只是没有哪个编译器能全部支持 boost 的所有库。
2011-1-11 15:38
0
雪    币: 63
活跃值: (17)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
11
www.boost.org Version 1.45.0
Compilers Tested
Boost's primary test compilers are:

Linux:
GCC: 3.4.6, 4.2.4, 4.3.4, 4.4.3, 4.4.5, 4.5.1.
GCC, C++0x mode: 4.3.4, 4.4.3, 4.5.0.
Intel: 10.1, 11.0, 11.1
Pathscale: 3.2.
OS X:
GCC: 4.0.1, 4.2.1, 4.4
GCC, C++0x mode: 4.4.
Intel: 11.1
Windows:
Visual C++: 7.1, 8.0, 9.0 and 10.0.     <<------
GCC, mingw: 4.3.3.
FreeBSD:
GCC: 4.2.1, 32 bit.
GCC: 4.2.1, 64 bit.

VC8/VC9可以完整编译BOOST所有库
2011-1-11 16:06
0
雪    币: 63
活跃值: (17)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
12
所以, 我觉得LZ这个题目没有意义, FOREACH由编译器实现更好.
用库实现的话, 又要使用各种各样的语言技巧.
2011-1-11 16:09
0
雪    币: 1708
活跃值: (586)
能力值: ( LV15,RANK:670 )
在线值:
发帖
回帖
粉丝
13
[QUOTE=nevergone;914272]所以, 我觉得LZ这个题目没有意义, FOREACH由编译器实现更好.
用库实现的话, 又要使用各种各样的语言技巧.[/QUOTE]

我的 boost 库是 1.34.1
编译器也是根据ANSI C++标准写的。
2011-1-11 16:40
0
雪    币: 182
活跃值: (81)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
14
看不懂哦,自己太菜了饿
2011-1-13 09:44
0
雪    币: 217
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
怎么都扯到BOOST上去了....不是只要对FOREACH进行重载不就可以了.....
2011-1-13 13:24
0
雪    币: 203
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
菜鸟低见:这样的东西没什么意义,只是在阅读代码时似乎达到了效果。
2011-1-13 13:34
0
雪    币: 140
活跃值: (18)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
字符和容器可以实现,但是数组自动计算大小搞不定
2011-1-26 15:26
0
雪    币: 140
活跃值: (18)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
LZ能贴出你的代码吗,学习学习
2011-1-26 15:26
0
雪    币: 233
活跃值: (285)
能力值: ( LV12,RANK:270 )
在线值:
发帖
回帖
粉丝
19
刚开始觉得问题并不算困难,用宏定义以及for和函数重载应该能搞定。
可是后来发现LZ把变量的声明放到了FOREACH的里面,变量的声明没办法放到函数参数中,所以不能直接define,目前还没想到该怎么处理,坐等高手解答……
2011-1-26 18:08
0
游客
登录 | 注册 方可回帖
返回
//