C++中如何实现两个vector的加权求和?
C++ 两个vector加权求和的std::transform实现方案
核心实现逻辑是使用支持双输入序列的std::transform重载,通过自定义二元运算(lambda或独立函数)实现加权求和逻辑,具体实现如下:
完整代码示例
#include <vector> #include <algorithm> // 如需四舍五入转int类型可引入下面的头文件 // #include <cmath> int main() { // 输入示例vector std::vector<int> a = {2, 0, 1, 5, 0}; std::vector<int> b = {0, 0, 1, 3, 5}; // 存储结果的vector,按加权求和后是浮点数选择double类型 std::vector<double> result; // 提前分配空间,避免插入时多次扩容 result.reserve(a.size()); std::transform( a.begin(), a.end(), // 第一个输入序列的起止迭代器 b.begin(), // 第二个输入序列的起始迭代器 std::back_inserter(result), // 输出迭代器,将结果尾插到result // 自定义逐元素加权运算逻辑 [](int val_a, int val_b) { return val_a * 0.25 + val_b * 0.75; // 若需要输出int类型,可改成下面的写法做四舍五入 // return static_cast<int>(std::round(val_a * 0.25 + val_b * 0.75)); } ); return 0; }
说明
- 上述实现中lambda是最常用的自定义运算逻辑方式,无需额外声明独立函数,调整权重或运算规则非常方便。如果不想使用lambda,也可以单独定义加权求和函数,将函数名作为
std::transform的最后一个参数传入即可。 - 使用前必须保证vector
b的长度不小于vectora的长度,否则会出现越界访问的未定义行为。 - 如果你的场景允许直接覆盖原有vector的内容,也可以将输出迭代器换成
a.begin(),直接把结果覆盖写入vectora中。
内容的提问来源于stack exchange,提问作者Harsh Sharma
相关产品推荐
相关产品推荐

