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;
    }
}