从 std::vector 的每个元素中减去一个值

Subtract a value from each element of a std::vector

本文关键字:一个 元素 vector std      更新时间:2023-10-16

我有一个像std::vector<float> myVector这样的向量。我必须从其每个元素中减去一个float值。使用for循环效率非常低,因为我的向量非常大 (5000+)。我试过了:

transform(myVector.begin(), myVector.end(), myVector.begin(), bind2nd(std::minus<float>(), valuesToRemove[0]));

其中valuesToRemove是一个float数组。 但这并没有改变我的原始载体。

如何以正确的方式执行此操作?

但它不会改变我的原始向量。我如何以正确的方式做到这一点?

std::transform用于在一个范围内映射函数,然后输出到另一个范围。std::for_each是您可以使用的就地模拟。

使用 for 循环效率非常低,因为我的向量很长 (5000+)

循环是在很长的向量(在(超级)标量处理器上)重复操作的最有效方法。

我建议以下几点:

for(auto& element : myVector)
element -= valuesToRemove[0];

您的循环可能会受益于矢量运算 (SIMD)。如果可能,请确保让编译器针对这些进行调优。如果编译器无法对循环进行矢量化处理,则可以显式展开迭代以加快其使用速度。如果失败,您可以尝试使用编译器内部函数手动矢量化,但代价是平台独立性。

如果您的向量足够长,并且该过程重复得足够长,那么使用向量处理器可能会受益。许多桌面系统都包含一个 GPU 形式的系统。现代 GPU 提供了一个 API 来执行一般矢量计算。