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

时间:2018-01-29 23:22:37

标签: c++ vector

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

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

其中valuesToRemovefloat数组。但这并没有改变我的原始载体。

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

1 个答案:

答案 0 :(得分:5)

  

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

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

  

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

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

我建议遵循:

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

您的循环可能会受益于矢量运算(SIMD)。如果可能,请确保让编译器调整。如果编译器无法对循环进行矢量化,则可以显式展开迭代以加快其使用。如果失败,您可以尝试使用编译器内在函数来手动进行矢量化,但代价是平台无关。

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