如何搜索对象指针C ++的向量

时间:2016-05-29 03:16:47

标签: c++ vector predicate stl-algorithm

我正在尝试搜索对象指针的向量。我的代码将提示用户输入名字或姓氏并打印出Profile对象信息。

即。用户将读入如下文本文件。

Homer Simpson hs742 donut123!
Bart Simpson bs1 don't-have-a-cow-man 
Smith Wesson sw666 gunsgunsguns

然后当用户输入像荷马这样的名字或姓氏时,代码将搜索向量并打印出来:

Homer Simpson hs742 donut123!

我的问题是尝试搜索并遍历vector<Profile *>。我尝试在互联网上搜索find_if,但它无效。

int main(){
    string fn;
    string ln;
    string usn;
    string pswrd;
    string name;

    vector <Profile *> pvector; //vector of object pointers
    ifstream myfile("file1.txt");

       if(myfile.is_open())
        {
            while (myfile >> fn >>ln >>usn>>pswrd)
            {
                Profile * prf;
                prf = new Profile(fn, ln, usn, pswrd);
                pvector.push_back(prf);
            }
        } else cout <<"Error opening file" <<endl;
        myfile.close();


    do {
        cout<<"Enter name to search for: ";
        cin>>name;
        //search vector
        vector<Profile *>::iterator it = find_if(pvector.begin(), pvector.end(), name);
        cout << "name: " << *it << '\n';

    } while (name != "end");


    return 0;
}

1 个答案:

答案 0 :(得分:1)

此答案包含使您的搜索工作的代码,以及find_if和函数谓词的简要说明。

来自STL的

find_if需要一元谓词作为它的第三个参数。这个website对find_if有很好的解释。在这种情况下,一元谓词意味着它需要一个布尔返回函数作为它的谓词。

name不起作用,因为它不是一种功能。

stackOverflow中的这个page有一个带有find_if的lambda表达式的好例子。这个website对于制作Lambda函数有很好的解释。

以下是find_if的示例,其中使用Lambda函数代替&#39; name&#39;在你的&#39; find_if&#39;这应该适合你。

auto it = find_if(pvector.begin(), pvector.end(), [=](const Profile *P){
        return P->fName == name || P->lName == name;
});

正如Loki指出的那样,请务必删除动态分配的配置文件,因为您的代码存在内存泄漏。任何时候你使用&#39; new&#39;关键字,您必须使用&#39;删除&#39;所以没有内存泄漏。这可以通过以下方式完成:

for (auto &x: pvector) delete (*x);

因为我没有看到你原来的Profile结构,所以我重新创建了最好的近似值,以便我可以测试它。这是我的结构。

struct Profile{
    string fName;
    string lName;
    string userName;
    string pWord;

    Profile(string fn, string ln, string usn, string pw)
            : fName(fn), lName(ln), userName(usn), pWord(pw)
    {}
};