c++ - 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;
});
- STL中是否有更合适的算法来表达意图?
- 我应该自己写吗?
- 还是有更好的方法来写这个,最好是 C++11/14 ?
解决方案
标准库两者都有inner_product
,transform_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";
}
推荐阅读
- python - 根据条件或值计算列中值的百分比
- spring - Spring Boot Keycloak 无法从
- dask - Dask:至少 N 天前有移位的列值
- solidity - 为什么我不能在 Solidity 中返回动态数组?
- kubernetes - k8s:将 YAML 转换为 JSON 时出错:yaml:第 33 行:找到无法启动任何令牌的字符
- php - 如何只允许 PHP 从我的服务器下载图像?
- node.js - 我不明白为什么在运行 docker 映像的容器时会出现此错误
- bash - 如何在文件中字符串的倒数第二个实例下方获取行
- google-cloud-platform - SignalR websockets 仅适用于第一次请求 Google Cloud Compute Engine
- python - Python Selenium Chrome 驱动程序负载