我有一个通常非常适合Java流的问题,但我目前正在使用c ++ 11.
我在Java中解决这个问题的方法是:
int solution = myList.stream() //myList is an arraylist of MyClass
.mapToInt(MyClass::GetInt)
.sum();
稍微探索了c ++标准库后,我已经了解到了这一点
存在std::transform
和std::accumulate
。
我唯一的问题是std::transform
似乎只能从类型T
映射到T
类型,我需要从类型T
映射到类型{{ 1}}(整数),在我积累之前。
理想情况下,我希望能够将这个逻辑链接在一起,而不是让临时数组存储每个步骤的中间结果。
是否有一种惯用的c ++ 11方法来实现这一目标?
答案 0 :(得分:0)
std::transform
可以转换为其他类型,但您甚至不需要这样。您可以使用std::accumulate
进行自定义操作,如下所示:
int solution = std::accumulate(
begin(myList), end(myList), 0,
[](int v, const MyClass &c) { return v + c.GetInt(); }
);
另一种方法,非常接近您发布的Java示例,将使用Boost.Range库:
int solution = boost::accumulate(
myList | boost::adaptors::transformed(boost::mem_fn(&MyClass::GetInt)),
0
);