使用C ++ 11

时间:2015-07-02 00:45:17

标签: c++ c++11

来自Python我想知道C ++现在是否在Python中有一些很好的功能。

目前我正试图弄清楚如何使用索引来生成一些元素的总和。例如,使用Python我会:

a = [ ... ]
b = [ ... ]

sum(map(lambda i: a[i] * 2 - b[i + 1], range(len(a)))

所以在这里我生成一个新数组,其中每个元素由一些索引算法确定。

在STL中有transformaccumulate,但它们将迭代器作为参数。如果仅在我需要更改具体元素的每个步骤上,这将是可以的。在这里,我需要使用索引。

同样使用transform我必须指定将结果放入的数组。是否有一种方法可以在运行中生成结果数组,然后返回?像Python map那样的东西。

因为在这种情况下,编写一个简单的for循环真的更容易。

1 个答案:

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

Live demo

如果您可以使用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];
                  })

Live demo