我经常看到您可以用STL算法替换所有手写/原始循环。为了提高我的C++知识,我一直在尝试这种方法。

为了用数据填充std::vector,我使用了for循环和loops索引。

unsigned int buffer_size = (format.getBytesPerSecond() * playlen) / 1000;

    // pcm data stored in a 'short type' vector
    vector<short> pcm_data;

    for (unsigned int i = 0; i < buffer_size; ++i)
    {
        pcm_data.push_back( static_cast<short>(amplitude * sin((2 * M_PI * i * frequency) / format.SampleRate)) );
    }

上面的代码工作正常,如您所见,我使用for循环索引“i”来使算法正确。

有人怎么能用标准中的东西代替for循环?

我见过的几乎可以允许我执行的唯一功能是std::transform和std::generate,但是这两个都不起作用,因为我需要为代码增加索引值。

例如:
generate_n(begin(pcm_data), buffer_size, [] ()
    {
        return static_cast<short>(amplitude * sin((2 * M_PI * i * frequency) / format.SampleRate)); //what is i??
    });

    transform(begin(pcm_data), end(pcm_data), begin(pcm_data) [] (???)
    {
        return static_cast<short>(amplitude * sin((2 * M_PI * i * frequency) / format.SampleRate)); //what is i??
    });

还是我只是简单地过了“没有原始循环”的想法?

最佳答案

您可以简单地在“generate_n”范围内使用变量来声明您的变量。

unsigned int i = 0;
generate_n(begin(pcm_data), buffer_size, [&] ()
    {
        return static_cast<short>(amplitude * sin((2 * M_PI * (i++) * frequency) / format.SampleRate)); //what is i??
    });

07-24 09:46
查看更多