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

har*_*rsh 4 c++ vector

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

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

哪里valuesToRemove是一个float数组.但这不会改变我原来的矢量.

我该如何以正确的方式做到这一点?

eer*_*ika 6

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

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

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

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

我建议如下:

for(auto& element : myVector)
    element -= valuesToRemove[0];
Run Code Online (Sandbox Code Playgroud)

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

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

  • 1. 检查编译器的手册 2. 另请检查同一手册 3. 购买矢量处理器并阅读其文档。 (2认同)