首页 > 解决方案 > STL中的算法扫描2个范围并调用函数

问题描述

STL 中是否有一种算法可以扫描两个(大小相同)范围并为每对条目调用一个函数?

std::equal()并且std::transform()似乎遵循这个概念,但是当意图是计算两个向量的差平方和时,它们并没有那么富有表现力:

vector<double> a = { 1.1, 1.0, 5.5 };
vector<double> b = { 1.4, 1.1, 5.3 };

// intended action
double sum_of_squared_diffs ( vector<double> a, vector<double> b ) {

   double sum =0;
   for (size_t i=0; i<a.size(); i++) {    // a.size() == b.size()
       sum += std::pow(a[i] - b[i], 2.0);
   }
   return sum;
}

// expressed with std::equal :(
double sum = 0;
std::equal(a.begin(), a.end(), 
           b.begin(), b.end(), [&sum](double a, double b) {
   sum += std::pow(a-b, 2.0);
   return false;
});

标签: c++algorithmstl

解决方案


标准库两者都有inner_producttransform_reduce它会为你做这件事。后者是 C++17。

#include <numeric>

int main()
{
    std::vector<double> a = { 1.1, 1.0, 5.5 };
    std::vector<double> b = { 1.4, 1.1, 5.3 };

    auto func = [](double a, double b)
        {
        return std::pow(a - b, 2);
        };

    double val1 = std::transform_reduce(a.begin(), a.end(), b.begin(), 0.0, std::plus<>(), func);
    double val2 = std::inner_product(a.begin(), a.end(), b.begin(), 0.0, std::plus<>(), func);

    std::cout << val1 << "\n" << val2 << "\n";
}

推荐阅读