0

我的代码有问题。我有一个名为 CPerson 的课程。

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”开头。

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

我正在尝试findfind_if但它从未奏效,不知道如何编写谓词,有什么想法吗?

4

3 回答 3

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);
                                 }));
于 2013-08-03T15:54:04.197 回答
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(),则迭代器指向具有姓氏为“Kow”的成员的对象。

于 2013-08-03T14:19:12.463 回答
0

Simple use of find_if is shown in http://www.cplusplus.com/reference/algorithm/find_if/ with a simple predicate function (IsOdd). To add an argument you are probably better off using a function object (functor) or bind1st on a binary function http://www.cplusplus.com/reference/functional/bind1st/.

If you are using C++11 you can use a lambda/anonymous function.

于 2013-08-03T14:18:54.303 回答