您的位置:首页 > 编程语言 > C语言/C++

C++ STL与C# LINQ中级联处理的对比

2014-06-25 16:13 239 查看
在LINQ中,如下的级联处理是常见的:
var result = src.select(x => f1(x))     // 用 y = f1(x), z = f2(y) 转换 x序列
                 .where(y => c1(y))     // 筛选条件: c1(y) 与 c2(z)

                .select(y => f2(y))

                 .where(z => c2(z));



在C++ STL中,没有相同的级联机制,但可以用函数嵌套(bind)的方法来实现相同操作:

// 将[p0, p1)中的数据转换、筛选后放到[p,)中。
transform_if(p0, p1, p, f2·f1, c1·f1 && c2·f2·f1);
/* 说明:
1. STL中有remove_copy_if,但没有transform_if,后者需要自己写。
2. f2·f1代表函数嵌套,正确形式为bind(f2, bind(f1, _1))。
3. (c1·f1 && c2·f2·f1)(x) = (c1·f1)(x) && (c2·f2·f1)(x),代表两个函数都估真值。
   注意,boost lambda支持这种表达式,而C++11不支持。
4. 编译器需要优化才能避免重复计算f1(x)等值。
*/
另一种标准处理方式则是使用transform_iterator与filter_iterator,它们分别对所指的值作转换操作与过滤操作,这未被包含在标准C++ STL中。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++ stl c++11 boost lambda