STL中的算法扫描2个范围并调用一个函数
algorithm in STL to sweep 2 ranges and call a function
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
and 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";
}
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
and 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";
}