C++高效完成多重转换
Efficiently completing multiple transformations in C++
我必须对数组中的每个元素执行以下数学运算:
X = Y*(X - 1) + 1
我目前是这样实现的:
#include <vector>
#include <algorithm>
for (unsigned i = 0; i < dataSet.size(); i++) {
std::transform(dataSet[i].begin(), dataSet[i].end(), dataSet[i].begin(),
std::bind2nd(std::minus<double>(), 1.00));
std::transform(dataSet[i].begin(), dataSet[i].end(), dataSet[i].begin(),
std::bind1st(std::multiplies<double>(), scaleFact));
std::transform(dataSet[i].begin(), dataSet[i].end(), dataSet[i].begin(),
std::bind2nd(std::plus<double>(), 1.00));
}
我能否在一次转换中完成 for 循环内的所有三个操作?
是否可以不使用for循环完成对vector of vector中每个元素的运算?
Can I complete all three of the operations inside the for loop in a single transform?
是的,你可以:
std::transform(dataSet[i].begin(), dataSet[i].end(), dataSet[i].begin(),
[scaleFact](double value) { return scaleFact * (value - 1) + 1; });
Can I complete the operation for every element in the vector of vectors without a for loop?
这有点棘手,因为您无法绕过一个循环。你可以使用的是一个循环的包装器,比如 std::for_each
:
std::for_each(std::begin(dataSet), std::end(dataSet), [scaleFact](auto& data) {
std::transform(data.begin(), data.end(), data.begin(),
[scaleFact](double value) { return scaleFact * (value - 1) + 1; });
});
或者更好的是,远程循环:
for (auto& data : dataSet)
{
std::transform(data.begin(), data.end(), data.begin(),
[scaleFact](double value) { return scaleFact * (value - 1) + 1; });
}
我只是要把它放在那里,我知道它在技术上不能回答你的问题。有时我认为人们对算法过度了。 for 循环真的那么糟糕吗?
for (auto& data : dataSet) {
for (auto& e : data) {
e = scaleFact * (e - 1) + 1;
}
}
我必须对数组中的每个元素执行以下数学运算:
X = Y*(X - 1) + 1
我目前是这样实现的:
#include <vector>
#include <algorithm>
for (unsigned i = 0; i < dataSet.size(); i++) {
std::transform(dataSet[i].begin(), dataSet[i].end(), dataSet[i].begin(),
std::bind2nd(std::minus<double>(), 1.00));
std::transform(dataSet[i].begin(), dataSet[i].end(), dataSet[i].begin(),
std::bind1st(std::multiplies<double>(), scaleFact));
std::transform(dataSet[i].begin(), dataSet[i].end(), dataSet[i].begin(),
std::bind2nd(std::plus<double>(), 1.00));
}
我能否在一次转换中完成 for 循环内的所有三个操作?
是否可以不使用for循环完成对vector of vector中每个元素的运算?
Can I complete all three of the operations inside the for loop in a single transform?
是的,你可以:
std::transform(dataSet[i].begin(), dataSet[i].end(), dataSet[i].begin(),
[scaleFact](double value) { return scaleFact * (value - 1) + 1; });
Can I complete the operation for every element in the vector of vectors without a for loop?
这有点棘手,因为您无法绕过一个循环。你可以使用的是一个循环的包装器,比如 std::for_each
:
std::for_each(std::begin(dataSet), std::end(dataSet), [scaleFact](auto& data) {
std::transform(data.begin(), data.end(), data.begin(),
[scaleFact](double value) { return scaleFact * (value - 1) + 1; });
});
或者更好的是,远程循环:
for (auto& data : dataSet)
{
std::transform(data.begin(), data.end(), data.begin(),
[scaleFact](double value) { return scaleFact * (value - 1) + 1; });
}
我只是要把它放在那里,我知道它在技术上不能回答你的问题。有时我认为人们对算法过度了。 for 循环真的那么糟糕吗?
for (auto& data : dataSet) {
for (auto& e : data) {
e = scaleFact * (e - 1) + 1;
}
}