C++将元素乘在一个向量中
C++ Multiplying elements in a vector
我一直在寻找以下问题的更优化解决方案,但似乎找不到。
假设我有一个向量:
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];
}
但是,有没有一种更"C++11"的方法可以做到这一点?我真的很想用lambda
来做这件事,这样我就可以计算向量的乘积,而不需要在类中有另一个函数,我宁愿在函数中计算它。
是的,和往常一样,有一个算法(尽管这个算法在<numeric>
中),std::accumulate
(实际示例):
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()
的两个值相加。CCD_ 11是一个将它们相乘的函子。
在C++14中,您可以用std::multiplies<>
替换std::multiplies<double>
,operator()
是模板化的,它将计算出类型。根据我在Eric Niebler的Ranges提案中看到的情况,它可能稍后看起来像vars | accumulate(1, std::multiplies<>())
,但对此持保留态度。
您可以使用基于范围的for循环,如:
std::vector<double> vars = {1, 2, 3}
int multi = 1;
for (const auto& e: vars)
multi *= e;
另一种方法是使用inclusive_scan
(C++17及以上版本)
优点是你可以得到第一个"的倍数;N〃;向量中的元素。下面是代码。注释中的解释。
#include <iostream>
#include <iterator>
#include <numeric>
#include <vector>
int main()
{
//INPUT VECTOR
std::vector<int> data{ 3, 1, 4, 1, 5, 9, 2, 6 };
//OUTPUT VECTOR WITH MULTIPLIES
//FIRST ELEMENT - 3
//SECOND ELEMENT - 3 * 1
//THIRD ELEMENT - 3 * 1 * 4
//FOURTH ELEMENT - 3 * 1 * 4 * 1
// ..
// ..
//LAST ELEMENT - 3 * 1 * 4 * 1 * 5 * 9 * 2 * 6
std::vector<int> multiplies(data.size());
//Multiply all numbers in given vector.
inclusive_scan(data.begin(), data.end(),
multiplies.begin(),
std::multiplies<>{});
//PRODUCT OF FIRST 5 ELEMENTS.
std::cout << "Product of first 5 elements :: " << multiplies[4] << std::endl;
//PRODUCT OF ALL ELEMENTS
std::cout << "Product of all elements :: " << multiplies[data.size() - 1] << std::endl;
}
此外,还有一个可以指定执行策略的重载。顺序执行或并行执行。需要包括";执行";头球
//MULTIPLY ALL NUMBERS IN VECTOR WITH PARALLEL EXECUTION.
inclusive_scan(std::execution::par,data.begin(), data.end(),
multiplies.begin(),
std::multiplies<>{});
相关文章:
- 给定一个向量,如何找到该向量的所有子集和的原始索引
- 为什么一个向量上的多线程操作很慢
- 将一个向量插入另一个向量的某个位置
- 将指向给定子类的指针从一个向量复制到另一个向量
- C++ STD 函数运算符:有没有一种方法可以通过函数将一个向量映射到另一个向量上?
- 将向量之间的数字放在另一个向量之间<vector>>如果两个数字的差值为 1
- 如何在不复制的情况下将一个向量移动到另一个向量中
- 使用 std::transform 将向量向量 (a) 添加到另一个向量向量 (b)
- 如何按另一个向量的方向调整一个向量?
- 将字符向量复制到另一个向量
- 制作一对共享指针并推送一个向量
- 你能把一个向量<int64>投射到一个向量<uint8>吗
- 大家好,当一个类有一个向量作为它的数据成员时,为什么它的大小总是24?
- 为什么我们需要在优先级队列声明中添加一个向量作为参数?
- 如何将所有指针从一个向量移动到另一个向量?
- 将一个向量映射到不同的对,即使向量映射到每对时是不同的?
- 生成一个类Name_class并将两种数据类型存储在一个向量中
- 使用步骤c++构建一个向量
- 如何从另一个向量中的另一个第一元素减去向量中的第一元素
- 将一个向量对放在一个无序映射与一个映射中