使用C ++映射过滤器和折叠

时间:2017-06-08 19:12:53

标签: 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::transformstd::accumulate

我唯一的问题是std::transform似乎只能从类型T映射到T类型,我需要从类型T映射到类型{{ 1}}(整数),在我积累之前。

理想情况下,我希望能够将这个逻辑链接在一起,而不是让临时数组存储每个步骤的中间结果。

是否有一种惯用的c ++ 11方法来实现这一目标?

1 个答案:

答案 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
);