Java 映射过滤器和折叠在C++;
我有一个通常非常适合Java流的问题,但我目前正在使用c++11 我用Java解决这个问题的方法是:Java 映射过滤器和折叠在C++;,java,c++11,functional-programming,Java,C++11,Functional Programming,我有一个通常非常适合Java流的问题,但我目前正在使用c++11 我用Java解决这个问题的方法是: int solution = myList.stream() //myList is an arraylist of MyClass .mapToInt(MyClass::GetInt) .sum(); 探索了C++标准库后,我才知道 std::transform和std::acculate存在 我唯一的问题是,std::transform似乎只能从类型T映射到类型T,在积累之
int solution = myList.stream() //myList is an arraylist of MyClass
.mapToInt(MyClass::GetInt)
.sum();
<>探索了C++标准库后,我才知道
std::transform
和std::acculate
存在
我唯一的问题是,
std::transform
似乎只能从类型T
映射到类型T
,在积累之前,我需要从类型T
映射到类型V
(整数)
理想情况下,我希望能够将此逻辑链接在一起,而不是使用临时数组存储每个步骤的中间结果
有一种惯用的c++11方法可以实现这一点吗?std::transform可以转换为不同的类型,但这里甚至不需要。您可以通过自定义操作使用
std::accumulate
,如下所示:
int solution = std::accumulate(
begin(myList), end(myList), 0,
[](int v, const MyClass &c) { return v + c.GetInt(); }
);
另一种非常接近您发布的Java示例的方法是使用该库:
再次阅读
累积
的文档。然后再说一遍,“似乎它只能从T型映射到T型”-你确定吗?
int solution = boost::accumulate(
myList | boost::adaptors::transformed(boost::mem_fn(&MyClass::GetInt)),
0
);