C++类实例 我正在做C++作业,但我被卡住了。< / P> 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;

C++类实例 我正在做C++作业,但我被卡住了。< / P> 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;,c++,C++,GetAccount方法应该检查实例是否已经存在并具有相同的帐号,如果已经存在,则返回该实例 我能想到的唯一方法是创建Account数组并搜索Account,然后如果它不存在,在数组中插入新的Account。如果存在,则返回指向数组的指针 这个方法在我看来并不有效,还有其他方法吗?你可以用a代替简单数组。你可以用a代替简单数组。考虑。考虑。创建帐户对象的std::map。创建帐户对象的std::map。是的。使用映射而不是数组。就空间而言,它可能更有效,而且几乎同样快 您可以使用STL并将您的帐

GetAccount方法应该检查实例是否已经存在并具有相同的帐号,如果已经存在,则返回该实例

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


这个方法在我看来并不有效,还有其他方法吗?

你可以用a代替简单数组。

你可以用a代替简单数组。

考虑。

考虑。

创建帐户对象的std::map。

创建帐户对象的std::map。

是的。使用映射而不是数组。就空间而言,它可能更有效,而且几乎同样快

您可以使用STL并将您的帐户保存在std::map中,这是以下变体之一:

map<int, Account> or
map<int, 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];
最后,在程序末尾的某个地方,您需要清理映射并删除所有帐户对象。即使没有清理,这个程序也可以正常工作,但是在你自己清理之后,这一点很重要。我将此作为练习留给您:
了解如何迭代映射的所有元素,并适当地应用delete。

是。使用映射而不是数组。就空间而言,它可能更有效,而且几乎同样快

您可以使用STL并将您的帐户保存在std::map中,这是以下变体之一:

map<int, Account> or
map<int, 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];
最后,在程序末尾的某个地方,您需要清理映射并删除所有帐户对象。即使没有清理,这个程序也可以正常工作,但是在你自己清理之后,这一点很重要。我将此作为练习留给您: 了解如何迭代映射的所有元素,并适当地应用delete

这种方法在我看来并不有效,还有其他方法吗

是的,正如其他人所提到的,有比数组更有效的方法使用数据结构。不过,如果您最近在课堂上学习过数组和循环,那么您描述的方法可能正是您的讲师所期望的。我不会试图超越你的导师太远,因为数组和循环方法可能是你考试时需要非常熟悉的一种方法。在你前进之前,在基础知识上有一个坚实的基础也是一个好主意。不过,不要让这件事阻止你在这里提出更高级的问题

这种方法在我看来并不有效,还有其他方法吗


是的,正如其他人所提到的,有比数组更有效的方法使用数据结构。不过,如果您最近在课堂上学习过数组和循环,那么您描述的方法可能正是您的讲师所期望的。我不会试图超越你的导师太远,因为数组和循环方法可能是你考试时需要非常熟悉的一种方法。在你前进之前,在基础知识上有一个坚实的基础也是一个好主意。不过,不要因为这一点而阻止你在这里提出更高级的问题。

你提出的方法是一个非常简单的ID数组,你可以通过它进行测试。不过,我会使用std::vector,而不是数组,因为这样就不必担心大小了。否则,您只需声明一个大数组,并在添加时测试它是否已满

就效率而言,在数百个小数组上进行线性搜索相当快,可能比其他解决方案(如地图和集合)更快。然而,它不能很好地扩展


试着把你的代码写好,但是在你知道你有问题之前不要担心优化它。我更希望我的程序员编写干净、易于维护的代码,而不是追求最佳速度。如果需要的话,我们可以在以后加快速度。

您提出的方法是一个ID数组,您可以遍历并测试它,这是一个非常简单的方法。不过,我会使用std::vector,而不是数组,因为这样就不必担心大小了。否则,您只需声明一个大数组,并在添加时测试它是否已满

就效率而言,在数百个小数组上进行线性搜索相当快,可能比其他解决方案(如地图和集合)更快。然而,它不能很好地扩展


试着把你的代码写好,但是在你知道你有问题之前不要担心优化它。我更希望我的程序员编写干净、易于维护的代码,而不是追求最佳速度。如果我们需要的话,我们总是可以加快速度。

我在C++上是非常新的,我一直在使用Google地图。莫斯
t页很难理解,而且它们并没有真正讨论带有对象的地图。。是否有任何来源,我可以看看?看看插入和擦除的基本插入和删除方法。您还可以使用索引语法myMap[key]=12,但请注意,如果条目不存在,它会创建条目。与所有STL容器一样,您需要熟悉迭代器的概念。如果您打算使用STL,并且我认为您应该这样做,我建议您查看一下Josuttis参考。至于对象的使用,请注意,插入到地图中会复制您正在存储的任何类型-如果您正在存储指针,它只会复制指针,等等。我不知道有任何关于STL地图的真正好的教程。我将在一秒钟内更新我的答案来解释如何使用STL地图。我是非常新的C++,我一直在使用Google地图。大多数页面都很难理解,而且它们并没有真正讨论带有对象的地图。。是否有任何来源,我可以看看?看看插入和擦除的基本插入和删除方法。您还可以使用索引语法myMap[key]=12,但请注意,如果条目不存在,它会创建条目。与所有STL容器一样,您需要熟悉迭代器的概念。如果您打算使用STL,并且我认为您应该这样做,我建议您查看一下Josuttis参考。至于对象的使用,请注意,插入到地图中会复制您正在存储的任何类型-如果您正在存储指针,它只会复制指针,等等。我不知道有任何关于STL地图的真正好的教程。我将在一秒钟内更新我的答案,以解释如何使用STL映射。在我看来,选择合适的数据结构以适应您正在做的事情的语义并不属于过早优化的范围;这是设计的一部分。如果您开始使用正确的方法,或者在语义上等同于您想要的方法,那么您需要进行的任何后续重构都会更容易。Knuth提醒不要解决效率低的问题,不要修复明显的错误设计选择。在我看来,选择合适的数据结构以适应您所做工作的语义并不属于过早优化的范畴;这是设计的一部分。如果您开始使用正确的方法,或者在语义上等同于您想要的方法,那么您需要进行的任何后续重构都会更容易。Knuth警告不要解决效率低的问题,不要修复明显的错误设计选择。是的。最有效的检查方法是数组,但由于要返回实例,因此需要指针空间。假设您计划拥有500个帐户,即500x4字节=2000字节或1.95KB。当然是32位指针。典型的查找类似于Account*GetAccountint an{return accountsArray[an];}accountsArray可以是编译时创建的静态数组,也可以是动态内存,由您选择。当然,其他解决方案也很好。使用地图或矢量是可以的。最有效的检查方法是数组,但由于要返回实例,因此需要指针空间。假设您计划拥有500个帐户,即500x4字节=2000字节或1.95KB。当然是32位指针。典型的查找类似于Account*GetAccountint an{return accountsArray[an];}accountsArray可以是编译时创建的静态数组,也可以是动态内存,由您选择。当然,其他解决方案也很好。使用地图或矢量是好的。