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

在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# LINQ中级联处理的对比)