来自Python我想知道C ++现在是否在Python中有一些很好的功能。
目前我正试图弄清楚如何使用索引来生成一些元素的总和。例如,使用Python我会:
a = [ ... ]
b = [ ... ]
sum(map(lambda i: a[i] * 2 - b[i + 1], range(len(a)))
所以在这里我生成一个新数组,其中每个元素由一些索引算法确定。
在STL中有transform
和accumulate
,但它们将迭代器作为参数。如果仅在我需要更改具体元素的每个步骤上,这将是可以的。在这里,我需要使用索引。
同样使用transform
我必须指定将结果放入的数组。是否有一种方法可以在运行中生成结果数组,然后返回?像Python map
那样的东西。
因为在这种情况下,编写一个简单的for循环真的更容易。
答案 0 :(得分:3)
无需创建中间数组,只需将std::transform
从图片中删除即可。您只需std::accumulate
即可得出中间结果。但是,正如您已经注意到的那样,这涉及跳过一些箍来获得给定迭代器的索引。
int a[] = {10, 20, 30, 40};
int b[] = {1, 2, 3, 4, 5};
std::accumulate(std::begin(a), std::end(a), 0,
[&](int acc, int& a_elem) {
auto index = std::distance(a, &a_elem);
return acc + a[index] * 2 - b[index + 1];
})
如果您可以使用Boost.Range,可以将其清理一下。这将允许您生成一系列可用作索引的整数,与Python示例非常相似。
boost::accumulate(boost::irange<unsigned>(0, boost::size(a)), 0,
[&](int acc, int index) {
return acc + a[index] * 2 - b[index + 1];
})