C ++类实例

时间:2009-06-03 22:49:30

标签: c++

我正在做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方法应检查实例是否已存在且具有相同的帐号,如果存在,则返回该实例。

我能想到的唯一方法是创建帐户数组并搜索帐户,如果它不存在,则在数组中插入新帐户。如果存在,则返回指向数组的指针。

这种方法对我来说似乎并不高效,还有其他方法吗?

6 个答案:

答案 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 ::地图帐户对象。