【问题标题】:How to search through vector of object pointers C++如何搜索对象指针向量C++
【发布时间】:2016-05-29 03:16:47
【问题描述】:

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

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

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

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

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;
}

【问题讨论】:

  • 您希望有一个 lambda 函数将名称与 Profile::name 进行比较。
  • 虽然 Galik 的回答是正确的,但对于这项任务,您可能需要地图而不是矢量。
  • 你需要一个指针向量吗?最好有一个对象向量。目前你的代码泄露了。
  • 一旦你得到它的工作,它可能值得审查:codereview.stackexchange.com

标签: c++ vector predicate stl-algorithm


【解决方案1】:

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

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

name 不起作用,因为它不是函数。

这个来自 stackOverflow 的 page 有一个很好的 lambda 表达式示例,带有 find_if。而这个website 对制作 Lambda 函数有很好的解释。

下面是find_if 的示例,其中一个 Lambda 函数代替了“find_if”中的“name”,这应该适合您。

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

正如 Loki 所指出的,请务必删除动态分配的配置文件,因为您的代码存在内存泄漏。每当您使用“new”关键字时,都必须使用“delete”,这样就不会出现内存泄漏。在您的情况下,这是通过以下方式完成的:

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)
    {}
};

【讨论】:

  • 谢谢,真的有帮助,我有一个问题。什么是 fName 和 lName 变量。他们来自哪里? P->fName == 名称 || P->lName == 名称;
  • 我为您的结构/类重新创建了一个近似值,以便使其可测试。我将编辑答案,以便您查看。这样我就可以将 first_name 和 last_name 的值与 name 进行比较,因为结构体被传递给 Lambda。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-01
  • 2011-02-11
  • 2010-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多