我一直在寻找以下更优化的解决方案,我似乎无法找到它。
我们说我有一个向量:
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
这样做,这样我就可以计算向量的乘法(乘积)而不需要在类中有另一个函数,我宁愿在函数内部计算它。
答案 0 :(得分:25)
是的,像往常一样,有一种算法(尽管<numeric>
中的这一个),std::accumulate
(live 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;