我想使用带有std :: remove / remove_if和std:erase的组合的MFC来操作包含来自递归搜索根的文件名列表的<std::shared_ptr<CString> >
向量。想象一下:
包含以下内容的对话框:
如果我选择Keep,我想保留所有带有已检查扩展名的文件,并删除其他所有文件或直接删除它们,如果我选择删除。举个例子,我想我可以使用类似
的东西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,那么我想保留或删除的文件除了第一个之外,已经从矢量中删除了!我不认为删除可以使用,因为它想要一个特定的值,显然所有的文件和路径都是唯一的。我可能可以遍历向量并保留或删除符合我索引条件的每个向量,但这似乎有点过分。那么我该如何完成这个呢?
我希望这是有道理的,如果其他地方有类似内容,请指示我。 TIA
答案 0 :(得分: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)=="...."))
}
);