我正在尝试搜索对象指针的向量。我的代码将提示用户输入名字或姓氏并打印出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;
}
答案 0 :(得分:1)
此答案包含使您的搜索工作的代码,以及find_if
和函数谓词的简要说明。
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)
{}
};