我正在使用向量容器来存储双精度数组。有没有快速 不使用循环将我的向量中的每个元素乘以某个标量的方法。
例如:
vector<double> Array(10,1);
将初始化10个双精度数组,初始值为1.乘以此值 数组由0.5我会写:
for(unsigned int i=0; i<Array.size(); i++)
Array[i] = 0.5*Array[i];
还有另外一种方法吗?我使用了重载'*'运算符的valarray 这样:
Array = 0.5 * Array;
是有效的,但我宁愿不使用valarray,因为它似乎是一个更多的向量容器 操作数组的标准方法。
谢谢!
答案 0 :(得分:10)
你可以这样做:
std::transform(Array.begin(), Array.end(), Array.begin(),
std::bind2nd(std::multiplies<double>(), 0.5));
回应获得元素总和:
double sum = std::accumulate(Array.begin(), Array.end(), 0.0);
为了回应每个元素的sqrt
:
std::transform(Array.begin(), Array.end(), Array.begin(),
static_cast<double (*)(double)>(std::sqrt));
该演员表是选择正确的过载。
答案 1 :(得分:1)
您可以使用std :: transform:
std::transform(Array.begin(), Array.end(), Array.begin(), std::bind1st(std::multiplies<double>(), 0.5)));
答案 2 :(得分:1)
STL向量本身不允许在单个操作中进行元素缩放。
您可以使用应用缩放因子的装饰器包装矢量。无论向量的大小如何,新因子的应用都是O(1)。这不是免费的,因为缺点是复杂性增加,每个元素的访问量更大。
答案 3 :(得分:1)
考虑使用std::valarray
,因为它是更合适的选择。
标准库提供各种容器是有原因的。它允许开发人员使用“马匹作为课程”。
std::vector
是最简单的容器,因此对于许多情况来说是最佳选择。但是,对于特定情况,另一种容器类型的附加功能可能使该类型成为更好的选择。这可能是一种这样的情况,其中数组成员的数值操作由std::valarray
更好地处理。
答案 4 :(得分:0)
据我所知,没有。
如果有的话,可能会为你封装这个循环。所以我不认为表现会改变。