2017-08-14 89 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