2012-06-19 71 views
0

我沒有使用boost庫。我如何使用STL來做到這一點?在對象的矢量上使用find_if

class Files 
{ 

private: 
    bool isSame(FileID f1, FileId f2) 
    { 
     if(f1.getId()==f2.getId()) 
     return true; 
     return false; 
    } 

public: 
    vector<FileId> mod_files; 

    void update() 
    { 
     FildId f = getFileId(); 
     vector<FildId>::const_iterator found = find_if(mod_files.begin(), mod_files.end(),   ???); 
    } 

}; 

我想通過isSame作爲第三個參數,以find_if功能,並結合「F」到isSame的第二個參數。

+0

我想你想你的私人和公共交換。這樣你可以從課堂外叫「isSame」。 –

回答

4

C++ 11這是簡單:

std::bind(&Files::isSame, this, f); 

在良好的舊C++ 03沒有mem_fun這需要兩個參數,所以你必須做你自己的綁定:

class is_same_pred 
{ 
public: 
    // unary function typedefs 

    explicit is_same_pred(Files& files, FileId f1) : _files(files), _f1(f1) {} 

    bool operator()(FileId f2) const { return _files.isSame(_f1, f2); } 

private: 
    Files& _files; 
    FileId _f1; 
}; 

哪裏isSameis_same_pred訪問,並在以後使用它像這樣:

is_same_pred(this, f); 

所有這一切說和做,你會過得更好定義isSame作爲靜態免費功能

bool isSame(FileId f1, FileId f2){ ... } 

std::bind1st(std::ptr_fun(&isSame), f); 
+0

爲了拋出我的兩分錢,我認爲一旦我們開始編寫自己的謂詞或試圖用bind1st,mem_fun等做些事情:現在是時候考慮放開find_if並且只寫一個簡單的舊的香草搜索循環,每個人都習慣於做。除非我們有工具(例如C++ 11/boost)以及必要的經驗,這樣通用算法才能從我們的指尖自由流動,我認爲它們應該避免。如果讓我們頭痛的寫下它,大多數人可能不想調試它。 – stinky472

+0

+1指出isSame作爲一種非靜態方法沒有任何好處,我希望我可以給出另一個+2來指出他想要做什麼,因爲他正在做的事情在C++ 03中是不可能的mem_fun(從一元到零,而不是二元到三元)和STL活頁夾 – stinky472