我需要帮助来尝试搜索类对象的数组。我有一个名为users的类,并且有一个存储3个玩家的数组。我希望能够在输入球员的两个名字时显示他的信息,并在输入姓名时删除他的记录。
我知道我可以使用向量列表来简化这一过程,但我设置了一些限制。我还认为可以实现线性搜索,但我不知道这是否足够有效。
#include <iostream>
#include <string>
#include <math.h>
using namespace std;
void storeinfo() ;
void showinfo() ;
void menu() ;
class user
{
string firstname, lastname, currentteam, position, status ;
int age ;
public:
user() {};
user(string fname, string lname, string cteam, string pos, string stat, int age)
{
setFirstName(fname);
setLastName(lname);
setCurrentTeam(cteam);
setPosition(pos);
setStatus(stat);
setAge(age);
} ;
void setFirstName(string fname)
{firstname = fname;}
void setLastName(string lname)
{lastname = lname;}
void setCurrentTeam(string cteam)
{currentteam = cteam;}
void setPosition(string pos)
{position = pos;}
void setStatus(string stat)
{status = stat;}
void setAge(int _age)
{age = _age;}
string getFirstName()
{return firstname ;}
string getLastName()
{return lastname ;}
string getCurrentTeam()
{return currentteam ;}
string getPosition()
{return position ;}
string getStatus()
{return status ;}
int getAge()
{return age ;}
};
user player[20] ;
int main()
{
menu() ;
cin.get() ;
return 0 ;
}
void storeinfo()
{
string firstname ;
string lastname ;
string currentteam ;
string position;
string status ;
int age ;
for (int i=0; i < 3; i++)
{
cout << "Enter First Name : " ;
cin >> firstname ;
player[i].setFirstName(firstname) ;
cout << "Enter Last Name : " ;
cin >> lastname ;
player[i].setLastName(lastname) ;
cout << "Enter Player's Age : " ;
cin >> age;
player[i].setAge(age) ;
cout << "Enter Current Team : " ;
cin >> currentteam ;
player[i].setCurrentTeam(currentteam) ;
cout << "Enter Position : " ;
cin >> position ;
player[i].setPosition(position) ;
cout << "Enter Status : " ;
cin >> status ;
player[i].setStatus(status) ;
cout << "\n\n\n" ;
}
/*cout << string(50, '\n');*/
menu() ;
}
void showinfo()
{
for (int i=0; i < 3; i++)
{
cout << "First Name : " << player[i].getFirstName() << "\n" << "Last Name : " << player[i].getLastName() <<
"\n" << "Age : " << player[i].getAge() << "\n" << "Current Team : " << player[i].getCurrentTeam() <<
"\n" << "Position : " << player[i].getPosition() << "\n" << "Status : " << player[i].getStatus() << "\n\n";
}
cin.get() ;
menu() ;
}
void menu()
{
cout << "\n MENU" << "\n" ;
cout << "\n 1. Store Player Information" ;
cout << "\n 2. Show Player Informaton" ;
cout << "\n 0. Exit \n \n" ;
string x = "";
cin >> x ;
if (x=="a")
{
storeinfo() ;
}
else if (x=="b")
{
showinfo() ;
}
else if (x=="c")
{
exit(0) ;
}
else
{
cout << "Invalid Choice" ;
menu() ;
}
}我已经做了一个线性搜索算法,似乎在工作,但我得到的输出是不正确的下面是两个函数的代码,再次感谢
int linsearch(string val)
{
for (int j=0; j < 3; j++)
{
if (player[j].getLastName()==val)
{
return j;
}
else
{
return 1;
}
}
void showinfo()
{
string search;
int found ;
cout << "Please Enter The Player's Last Name : " ;
cin >> search ;
found=linsearch(search);
if (found== 1)
{
cout << "\n There is no player called " << search ;
}
else
{
cout << "\n First Name : " << player[found].getFirstName() << "\n" << "Last Name : " << player[found].getLastName() <<
"\n" << "Age : " << player[found].getAge() << "\n" << "Current Team : " << player[found].getCurrentTeam() <<
"\n" << "Position : " << player[found].getPosition() << "\n" << "Status : " << player[found].getStatus() << "\n\n";
}
cin.get() ;
menu() ;
}发布于 2013-01-23 04:04:57
如果你的数据集可以变得更大,那么哈希表就是你脑海中浮现的解决方案。请确保为您的任务选择冲突不多的散列算法。顺便说一句,还有"perfect hashing algorithms“--如果”所有时间都有0个冲突“很重要,你应该考虑一下--无冲突、快速的哈希表将大大提高速度。
发布于 2013-01-23 04:14:41
将键(如用户名)映射到某种记录的标准解决方案是map。
股票std::map使用平衡树,它提供O(log )搜索,这通常足够好(而且比线性好得多),还允许您按排序顺序迭代名称。这需要有序类型,这意味着user1 < user2是有意义的。
或者,std::unordered_map使用哈希表,它提供O(1)搜索,但没有任何排序。这需要一个hashable类型,这意味着hash(user1)是有意义的。它还需要C++11,或将其作为tr1或boost的一部分的C++03实现。
哪一个是合适的取决于您的需求-但通常,它们都很好,这只是一个问题,你是否有一个自然的排序或自然的散列函数。
除了比vector、list或其他需要线性搜索的集合更有效地从中间进行搜索和删除之外,它也更简单、更自然。例如,比较这两个:
user find_by_name(vector<user> users, string name) {
return find_if(users.begin(), users.end(), [](auto it) { it->name == name; });
}
user find_by_name(map<string, user> users, string name) {
return map.find(name);
}(而且,如果您没有C++11 lambda,那么find_if会更糟。)
至于“线性搜索…是否足够有效”,这实际上取决于集合的大小。如果你每隔几秒钟通过100个用户进行一次搜索,那么几乎任何东西都足够高效。如果你通过数以百万计的用户进行数千次搜索,很可能不是这样的。如果你不知道足够多的信息来估计,那就试试看看吧。在任何优化问题中,分析几乎都应该是第一步。然而,在这种情况下,考虑到map或unordered_map比vector或list更简单、更容易阅读、更自然,我认为您不需要为此而烦恼。
https://stackoverflow.com/questions/14466723
复制相似问题