从 std::vector 的每个元素中减去一个值
Subtract a value from each element of a std::vector
我有一个像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 来执行一般矢量计算。
相关文章:
- lower_bound()返回最后一个元素
- 基于范围的 for 循环:迭代使用一个元素扩展的向量
- 使用运算符 [] 引用 std::vector 上最后一个元素时出现问题<>
- Lower_bound不适用于具有 3 个元素的向量的最后一个元素
- 检查 2D 网格的某个元素是否与另一个元素共享对角线、水平线或垂直线
- 仅显示链表的最后一个元素
- push_back通过自行创建的对象获取最后一个元素的向量
- 使用 map.end() 访问 map 的最后一个元素
- 如何知道地图中的最后一个元素是否被删除?
- 选择一个元素而不是一个对象的数组的原因
- std::矢量保存 只推送最后一个元素
- 为什么这个选择排序算法仍然切换一个元素,当它已经是其他元素中最小的元素时?
- 反转后不返回最后一个元素
- 如何在新数组较小时创建新数组并将旧数组的最后一个元素复制到新数组中?
- 访问 for_each 函数中的前一个元素
- 在 QListView 中显示最后一个元素
- 从 std::vector 中选择一个元素,而不是给定元素
- C++:在进行切片时对迭代器的约定,特别是对于访问最后一个元素并最终将其删除
- 遍历列表包含排除最后一个元素的内容
- 如何从一个无序集合中获取一个元素