C ++向量中的乘法元素

时间:2015-03-19 13:41:21

标签: c++ c++11

我一直在寻找以下更优化的解决方案,我似乎无法找到它。

我们说我有一个向量:

std::vector<double> vars = {1, 2, 3}

我想执行1 * 2 * 3我知道我可以执行以下操作:

int multi = 1;

for(int i = 0; (i < vars.size()-1); i++)
{
    multi *= vars[i];
}

但是,还有更多的&#34; C ++ 11&#34;这样做的方法?我真的想使用lambda这样做,这样我就可以计算向量的乘法(乘积)而不需要在类中有另一个函数,我宁愿在函数内部计算它。

2 个答案:

答案 0 :(得分:25)

是的,像往常一样,有一种算法(尽管<numeric>中的这一个),std::accumulatelive example):

using std::begin;
using std::end;
auto multi = std::accumulate(begin(vars), end(vars), 1, std::multiplies<double>());

std::multiplies也位于<functional>。默认情况下,std::accumulate使用std::plus,这会为operator()添加两个值。 std::multiplies是一个将它们相乘的仿函数。

在C ++ 14中,您可以将std::multiplies<double>替换为std::multiplies<>,其operator()是模板化的,并会计算出类型。基于我在Eric Niebler的Ranges提案中看到的内容,它可能后来看起来像vars | accumulate(1, std::multiplies<>()),但是可以用一点点盐。

答案 1 :(得分:5)

您可以使用基于范围的for循环,如:

std::vector<double> vars = {1, 2, 3}
int multi = 1;

for (const auto& e: vars)
    multi *= e;
相关问题