gpt4 book ai didi

c++ - 如何搜索对象指针 vector C++

转载 作者:行者123 更新时间:2023-11-28 05:39:23 29 4
gpt4 key购买 nike

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

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

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

然后当用户输入名字或姓氏(如 Homer)时,代码将搜索 vector 并打印出来:

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

最佳答案

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

来自 STL 的

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

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

page来自 stackOverflow 的 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)
{}
};

关于c++ - 如何搜索对象指针 vector C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37505822/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com