在struct C ++的向量中使用find_if和remove_if

时间:2018-01-15 22:17:47

标签: c++ lambda

我有一个程序,其结构充满了不同人的信息。还有一个载人,有了它。

struct Person
{
    std::string fName;
    std::string lName;
    float  length;
    std::string nSignature;

    bool operator==(const Person& m) const {
        return ((m.fName == fName) && (m.lName == lName) && (m.length == length) && (m.nSignature == nSignature));
    }
};

现在我要做的是,使用find_if并搜索结构中的nSignature。如果是,打印出与其连接的所有元素。

示例:

名字:约翰 姓:Doe 长度:1,78米 签名:johdoe

现在,如果我搜索johdoe,并且找到它,我想打印出与签名johdoe相关的所有细节(如abow)。

但这不是现在的主要问题,主要的问题是我无法让我的搜索工作。

void searchName(vector<Person> &persons)
{
    string nameToFind;
    cout << "Search" << flush;
    cin >> nameToFind;

    auto findIt = find_if(persons.begin(), persons.end(), [&nameToFind](Person& person) {
        return person.nSignature == nameToFind;
    });

    if (findIt != persons.end()) 
        cout << findIt << endl;

}

它没有找到任何东西,也没有返回任何东西。

我是否误解了find_if和运营商的使用?

1 个答案:

答案 0 :(得分:1)

您的代码应该有效,并且会找到第一个正确的签名。

唯一的问题是你需要取消引用迭代器,并且还要为你的类重载操作符<<

cout << *findIt << endl;

或者如果你不想超载,你可以明确地想要你想要的东西

cout << findIt->fName << " " << findIt->lName  << endl;

像这样过载,那么它会很好用。

ostream& operator<<(ostream& os, const Person& p)  
{  
    os << p.fName << " " << p.lName << " " << p.length << " " << p.nSignature << endl;
    return os;  
}