2013-08-03 116 views
0

我与我的代码有问题。我有一个叫CPerson的课。如何搜索列表元素,STL C++

class CPerson { 
private: 
    string name; 
    string lastName; 
    int age; 
    char *pPesel; 

public: 

    CPerson(string i, string n, int w, char *pPes); 
... 
}; 

我有一个列表。

list <CPerson> lst; 

list <CPerson> ::iterator it; 
it = lst.begin(); 

CPerson wzor1("John", "Steward", 22, "2323" ); 

当我往里面放,我想找到一个CPerson实例,其lastName场开始,例如,以“汉口”。

是否可以将该“Kow”作为任何函数的参数?

我想用findfind_if但它从来没有工作,不知道如何写一个谓词,任何想法?

+0

我可以添加所有代码,但它是不必要的,因为我有一个问题只与功能find_if .. – 2013-08-03 12:32:40

+1

绕行轻微:不要在类名前加上'C',这没有什么好的理由。该公约起初是一种误解,毫无用处。 –

+0

填写完列表后,您是否想要姓氏成员为“Kow”的对象? – Mahesh

回答

1

谓词就像遍历容器时每个元素上的回调函数。

bool VerifyLastName(CPerson& obj) 
{ 
    return (obj.getLastName() == "Kow"); 
} 

std::list<CPerson>::iterator it = std::find_if(lst.begin(), lst.end(), VerifyLastName); 

如果it不等于lst.end(),然后迭代器指向与姓氏为“汉口”成员的对象。

1
//Create a member function getLastName in your class 
std::string CPerson::getLastName(void){ 
return lastname; 
} 

//Create a function object for find_if use. 
struct checkLastName{ 
    checkLastName(const std::string & test):checkName(test){} 
    bool operator()(CPerson& ob){ 
     return ob.getLastName().substr(0, checkName.size()).compare(checkName); 
    } 
    std::string checkName; 
}; 

std::string lname; 
cin>>lname; //"Kow" 

//Use std::find_if 
std::list<CPerson>::iterator it = 
      std::find_if(lst.begin(), 
        lst.end(), checkLastName(lname)); 

if(it!=lst.end()) 
    std::cout<<" Found "; 

用C++ 11,可以使用lambda函数为:

std::list<CPerson>::iterator it = 
      std::find_if(lst.begin(), 
         lst.end(), 
        [lname](CPerson const& ob){ 
        return ob.getLastName().substr(0, lname.size()).compare(lname); 
           })); 
+0

布尔运算符(CPerson&OB) – volly

+0

@volly对不起,谢谢,更新 – P0W

+0

我的想法:),如果(它= list.end()!) - 应该是如果(它= lst.end()!)?我不知道它是什么意思 - “lst.end() - 它;”,我必须重载下一个运算符“ - ”? – volly