对于任务,我正在进行一些简单的数据采样,以确定哪些样本包含计算能量总数的音频。我一直在调查std::count_if
函数,虽然这在某种程度上符合我的需要,例如:
int foo = std::count_if(
std::begin(samples),
std::end(samples),
containsSound);
这会计算包含声音的样本总数,但不会对包含声音的样本进行指示。我提出了这个解决方案:
std::vector<std::string> sound_files = myLib::count_sample_if(
std::begin(samples),
std::end(samples),
samples.DirName,
containsSOund);
然后将samples.DirName
存储并推送到vector
,我可以使用它来存储我选择的样本集。
我的问题是这是否易于实施?
答案 0 :(得分:4)
如果您只需要可读性/开发速度而不关心性能,那么您可以轻松使用std::copy_if
和std::transform
来获取所需内容:
std::vector<Song> songs;
std::vector<Song> filtered;
std::vector<std::string> transformed;
std::copy_if(songs.begin(), songs.end(), filtered.begin(), [](const Song &song) { return whatever you need; });
std::transform(filtered.begin(), filtered.end(), transformed.begin(), [](const Song &song) { return song.sample; });
或者您可以使用std::for_each
:
std::vector<Song> songs;
std::vector<std::string> transformed;
std::for_each(songs.begin(), songs.end(), [&](const Song &song) { if (song.containsSample()) transformed.push_back(song.sample); });
然后包含声音的样本量仅为transformed.size()
。
答案 1 :(得分:1)
实施起来非常容易 - 另外,没有必要实施它。您可以编写一个仿函数(也就是函数对象)或lambda表达式来进行比较并为您保存向量,这样您就可以继续使用std::count_if
(或其他标准算法之一)。
std::vector<std::string> mySongs;
std::string myDirectory = "C:/";
std::copy_if(std::begin(samples), std::end(samples), std::back_inserter(mySongs), [](const std::string& s)
{
// return true or false based on some criteria here
});
std::transform(std::begin(mySongs), std::end(mySongs), std::begin(mySongs), [](const std::string& s)
{
return myDirectory + s;
});
答案 2 :(得分:1)
如果我理解正确,最简单的方法是使用标准算法std :: copy_if。不需要计算元素,因为您可以通过使用另一个标准函数std :: distance来获取它。例如,假设您有一个整数数组,并希望计算正值,同时将它们复制到向量中。代码可以采用以下方式
int a[] = { 1, -3, -5, 9, 2, -4, -1, -7, 5, 8 };
std::vector<int> v;
std::copy_if( std::begin( a ), std::end( a ),
std::back_inserter( v ),
std::bind2nd( std::greater<int>(), 0 ) );
std::cout << "The number of positive elements is " << std::distance( v.begin(), v.end() ) << std::endl;
答案 3 :(得分:0)
这里是count_if的实现,您需要做的就是创建一个向量,如果可以接受则推回结果,并在完成循环遍历范围后返回向量。