我正在做intro c ++家庭作业,但我被困了。
Account *GetAccount(int an);
int main()
{
Account *a1,*a2,*b1;
a1=GetAccount(123);
a2=GetAccount(456);
b1=GetAccount(123);
if(a1==b1)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
GetAccount方法应检查实例是否已存在且具有相同的帐号,如果存在,则返回该实例。
我能想到的唯一方法是创建帐户数组并搜索帐户,如果它不存在,则在数组中插入新帐户。如果存在,则返回指向数组的指针。
这种方法对我来说似乎并不高效,还有其他方法吗?
答案 0 :(得分:8)
是。而不是数组,使用地图。它在空间方面更有效率,而且几乎一样快。
您可以使用STL并将您的帐户保存在std :: map中,这是以下变体之一:
map<int, Account> or
map<int, Account*>
在第一种情况下,您将帐户保留在地图中,在第二种情况下,您将指针保留在帐户中,并负责创建/删除。哪种变体更合适?这取决于您创建/初始化帐户的方式。
关于STL地图使用的简短教程
当你将指针保留在地图中时,我会说明这一点。
这是你宣布地图的方式:
map<int, Account*> accounts;
这是您向地图添加新帐户的方法:
int account_id = 123; // or anything else
Account* account = new Account(...paramters for the constructor...)
// any additional code to initialize the account goes here
accounts[account_id] = account; // this adds account to the map
这是检查account_id帐户是否在地图中的方法:
if (accounts.find(account_id) != accounts.end()) {
// It is in the map
} else {
// it is not in the map
}
这是您从地图获取指向帐户的指针:
Account* ifoundit = accounts[account_id];
最后,在程序结束的某个地方,您需要清理地图并删除所有帐户对象。即使没有清理,该程序也能正常工作,但重要的是要在自己之后进行清理。我把它作为锻炼给你:) 找到如何迭代地图的所有元素,并适当地应用删除。
答案 1 :(得分:2)
考虑hash tables。
答案 2 :(得分:2)
这种方法对我来说似乎并不高效,还有其他方法吗?
是的,正如其他人所提到的,使用除数组之外的数据结构有更有效的方法。但是,如果您最近一直在研究类中的数组和循环,那么您描述的方法可能就是您的教师所期望的。我不会试图让太多远远超过你的教练,因为数组和循环方法可能是你参加考试时需要非常熟悉的东西。在你前进之前,在基础知识方面有一个坚实的基础也是一个好主意。 (不要让这阻止你在这里提出更高级的问题。)
答案 3 :(得分:1)
您可以使用std::map代替简单数组。
答案 4 :(得分:1)
你提出的方法,你走过并测试的一组id,是一个非常简单的方法。我会使用std :: vector,但不是数组,因为你不必担心大小。否则,您只需声明一个大数组,并在添加时测试它是否已满。
就效率而言,对小型阵列(数百个)进行线性搜索非常快,并且可能比其他解决方案(如地图和集合)更快。但是,它不能很好地扩展。
尝试编写好您的代码,但在您知道自己有一个探测器之前不要担心优化它。我宁愿我的程序员编写干净,易于维护的代码,而不是追求最佳速度。如果需要的话,我们总能在以后加快速度。
答案 5 :(得分:0)
创建帐号#=&gt;的std ::地图帐户对象。