C++ copy_if lambda capture std :: string

Pho*_*rce 5 c++ lambda c++11

这是一个跟进问题:C++ - 开发自己的std :: count_if版本

我有以下功能:

// vector for storing the file names that contains sound 
std::vector<std::string> FilesContainingSound; 

void ContainsSound(const std::unique_ptr<Signal>& s)
{
    // Open the Wav file 
    Wav waveFile = Wav("Samples/" + s->filename_); 

    // Copy the signal that contains the sufficient energy 

    std::copy_if(waveFile.Signal().begin(), waveFile.Signal().end(), 
                 FilesContainingSound.begin(), [] (const Signal& s) {

                     // If the energy bin > threshold then store the 
                     // file name inside FilesContaining
                 }
}
Run Code Online (Sandbox Code Playgroud)

但对我来说,我只需要在lambda表达式中捕获字符串"filename",因为我只会使用它.我只需要访问waveFile.Signal()以进行分析.

有人有什么建议吗?

编辑:

std::vector<std::string> FilesContainingSound;
std::copy_if(w.Signal().begin(), w.Signal().end(), 
             FilesContainingSound.begin(), [&] (const std::unique_ptr<Signal>& file) {

                 // If the energy bin > threshold then store the 
                 // file name inside FilesContaining
             });
Run Code Online (Sandbox Code Playgroud)

Jer*_*fin 4

您似乎在这里混淆了不同层次的抽象。如果您要使用文件名,那么您基本上需要按以下顺序进行操作:

std::vector<std::string> input_files;
std::vector<std::string> files_that_contain_sound;

bool file_contains_sound(std::string const &filename) { 
     Wav waveFile = Wav("Samples/" + filename);

     return binned_energy_greater(waveFile, threshold);
}

std::copy_if(input_files.begin(), input_files.end(),
             std::back_inserter(files_that_contain_sound),
             file_contains_sound);
Run Code Online (Sandbox Code Playgroud)

目前,我将 放在file_contains_sound一个单独的函数中,只是为了使其类型清晰 - 因为您正在处理文件名,所以它必须将文件名作为字符串,并返回一个布尔值,指示该文件名是否是一个您希望出现在结果集中的组的名称。

实际上,您几乎从来没有真正想要将其实现为实际函数——您通常希望它成为某个重载类的对象operator()(而 lambda 是生成此类类的简单方法)。但涉及的类型必须保持不变:它仍然需要将文件名(字符串)作为参数,并返回一个布尔值来指示该文件名是否是您想要在结果集中出现的文件名。处理文件内部内容的所有内容都将发生在该函数(或其调用的函数)内部。