2012-06-19 37 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