我经常看到您可以用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??
});