2017-08-14 95 views
0

我想用std :: remove/remove_if和std:erase的组合来操作包含递归搜索根的文件名列表的<std::shared_ptr<CString> >矢量。想象一下以下内容:随机矢量处理

包含一个对话框:

  • 两个单选按钮(保留和删除)
  • 一些复选框以图像文件 扩展为标签(JPG,TIF,GIF等。)
  • 一个按钮做的动作

如果我选择保留,我想保留的所有文件与检查扩展和删除一切或删除directl如果我选择删除。举个例子,我想我可以使用类似的东西来

void CPicsDlg::FilterFiles(void) 
{ 
    auto end = std::remove_if(g_vFiles.begin(), g_vFiles.end(), [&](std::shared_ptr<CString> const &strFile) { return strFile->Right(3) == "JPG" || strFile->Right(3) == "TIF" }); 

    g_vFiles.erase(end, g_vFiles.end()); 
} 

,如果我想保持或只是那些2个扩展删除文件。但我永远不会知道选中哪个复选框,所以我不知道如何构建自己的条件,并且我认为如果我一次尝试使用remove_if,那么除了第一个文件之外,我想要保留或删除的文件一个已经从矢量中删除了!我不认为可以使用remove,因为它需要特定的值,显然所有的文件和路径都是唯一的。我可能可以迭代遍历矢量,并保留或删除每个符合我的条件的索引,但这似乎是过度杀伤。那么我该如何去做到这一点呢?

我希望这是有道理的,如果其他地方已经有类似的东西,请在那里指导我。 TIA

回答

0

如果我理解的题目了改正它仅仅是一个简单的XOR

Keep Match ToDelete 
0 0  0 
0 1  1 
1 0  1 
1 1  0 

的代码是

bool bKeep = IsDlgButtonChecked(IDC_KEEP)!=0; 
bool bTypeJPG = IsDlgButtonChecked(IDC_JPG)!=0; 
bool bTypeTIF = IsDlgButtonChecked(IDC_TIF)!=0; 
... 
auto end = std::remove_if(g_vFiles.begin(), g_vFiles.end(), 
    [&](std::shared_ptr<CString> const &strFile) 
    { 
     return bKeep^
       ((bTypeJPG && strFile->Right(4)==".JPG") || 
       (bTypeTIF && strFile->Right(4)==".TIF") || 
       (bType... && strFile->Right(4)=="....")) 
    } 
); 
+0

感谢。这正是我所需要的。如果我多使用XOR,我可能会自己拿出这个! :)如果复选框和扩展程序是以编程方式创建的,因为总金额未知,是否可以调整它? – user638473