c++11 - 何时更喜欢 for 循环而不是 std::transform,反之亦然

标签 c++11 for-loop stl

我想了解什么时候使用 std::transform 更实用
当老式的 for 循环更好时。

这是我的 for 循环代码,我想将两个向量组合成一个复杂的向量:

    vector<double> vAmplitude = this->amplitudeData(N);
    vector<double> vPhase = this->phaseData(N);
    vector<complex<double>,fftalloc<complex<double> > > vComplex(N);
    for (size_t i = 0; i < N; ++i)
    {
        vComplex[i] = std::polar(vAmplitude[i], vPhase[i]);
    }

这是我的 std::transform 代码
    vector<double> vAmplitude = this->amplitudeData(N);
    vector<double> vPhase = this->phaseData(N);
    vector<complex<double>,fftalloc<complex<double> > > vComplex;
    std::transform(
                begin(vPhase), end(vPhase), begin(vAmplitude),
                std::back_inserter(vComplex),
                [](double p, double a) { return std::polar(a, p); });

请注意,vComplex 是在没有大小的情况下分配的,所以我想知道分配是什么时候发生的。我也不明白为什么在 lambda 表达式中,pa必须颠倒它们的用法。

最佳答案

支持标准算法的一个考虑因素是它为 c++17 alternative execution model versions 准备了您的代码(和您)。 .

借用 JoachimPileborg 的回答,假设您将代码编写为

vector<complex<double>,fftalloc<complex<double> > > vComplex(N);
std::transform(
    begin(vAmplitude), end(vAmplitude), begin(vPhase),
    std::begin(vComplex),
    std::polar);

一段时间后,您意识到这是代码中的瓶颈,您需要并行运行它。因此,在这种情况下,您需要做的就是添加
std::execution::par{} 作为 std::transform 的第一个参数.在手动版本中,您的(符合标准的)并行性选择消失了。

关于c++11 - 何时更喜欢 for 循环而不是 std::transform,反之亦然,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39174060/

相关文章:

c++ - D 在现场的使用

c++ - 如果类具有特定的成员函数,则启用模板函数

C++11 隐式转换

python-3.x - for循环中的“unexpected EOF while parsing”?

c++ - 如何在C++中正确使用for-range语句语法?

c++ - 如何进一步优化这个简单的算法?

javascript - 为什么我的 for 循环从最后一项开始并在一次迭代后停止运行?

c++ - 如何找到任何对象使用的内存

c++ - 我应该将什么作为分配器传递给 std::hash_map?

c++ - 如何初始化STL容器中存在的类的数据?