随机向量操作

时间:2017-08-14 17:38:55

标签: c++11 vector mfc

我想使用带有std :: remove / remove_if和std:erase的组合的MFC来操作包含来自递归搜索根的文件名列表的<std::shared_ptr<CString> >向量。想象一下:

包含以下内容的对话框:

  • 两个单选按钮(保留和删除)
  • 带有图像文件的多个复选框 作为标签的扩展名(JPG,TIF,GIF等)
  • 执行操作的按钮

如果我选择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

1 个答案:

答案 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)=="...."))
    }
);