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中。
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++与C#对常用数据结构封装的对比(STL vs System.Collections.Generic)
- 【转载】C++与C#对常用数据结构封装的对比(STL vs System.Collections.Generic)
- C++与C#对常用数据结构封装的对比(STL vs System.Collections.Generic)
- C++与C#对常用数据结构封装的对比(STL vs System.Collections.Generic)
- C++与C#对常用数据结构封装的对比(STL vs System.Collections.Generic)
- C++与C#对常用数据结构封装的对比(STL vs System.Collections.Generic)[转自柒笑侠]
- C++与C#内存管理对比分析 (转载)
- C#与C++中的类的对比分析
- C++、Java和C#中的异常处理
- 简单了解C++、Java和C#中的异常处理
- 我对C++的前景看法 C++和C#的对比(转载)
- Java与C#事件处理详细对比
- 海量数据处理利器 STL中哈希表 hash_map(C++)
- C++、Java和C#中的异常处理
- C++中MFC的消息映射机制与C#的事件驱动机制对比
- 最接近C# 的Event的C++处理
- C++、Java和C#中的异常处理
- 编写高效的C#图像处理程序(4) Rgb=>Lab,C# vs. C++(VC)
- 再谈static在C++和C#中的不同处理
- C++与C#内存管理对比分析