遗憾的是,我需要开发一个基于代理的模型。我的背景是C ++;我很体面但不是专业的程序员。我的目标是确定,暂时不考虑我的背景,使用C ++或Java编写以下类型的算法会更快或更容易。
Host
。他们的私人成员变量包括他们对不同菌株的感染和免疫状态(类型int
)。 (在C ++中,我可能会使用unordered_map
或vector
来保存此信息,具体取决于应变的数量。)我计划跟踪向量中的所有主机vector< Host *> hosts
。 vector< Host *> immune
和vector< Host *> infectious
(我可能会使每个二维结构,通过菌株索引,然后是宿主)。host
中找到合适的人物并在其他结构(immune
和infectious
中搜索)以查找所有结构指向此对象的指针。 我的印象是,如果删除底层对象,Java将隐式删除所有这些指针。这是真的吗?在C ++中使用比我这里更好的方法吗?提前感谢您的帮助。
我应该补充一点,如果我使用C ++,我将使用智能指针。也就是说,当对象需要时,我仍然没有看到删除指向对象的所有指针的方式。 (当主机死机时,我想从内存中删除它。)
我意识到在Java中需要学习很多东西。我希望有人能够更多地了解语言之间的差异,以及谁能理解我需要做什么(上图),可以告诉我一种语言是否显然比另一种语言更有效。
答案 0 :(得分:1)
我无法回答你的所有问题,但是
我的印象是,如果删除底层对象,Java将隐式删除所有这些指针。
在Java中,您不删除对象;相反,当它的引用计数变为零时,它会被有效删除。但是,您可能希望在此使用weak references;这样,当强引用计数变为零时,对象就会消失。
答案 1 :(得分:1)
我的印象是,如果删除底层对象,Java将隐式删除所有这些指针。这是真的?
不。你实际上倒退了;如果删除所有指针,Java将删除基础对象。因此,您仍需要搜索所有三个数据结构(hosts
,immune
和infectious
)以杀死该特定主机。
但是,如果您使用正确的数据结构,这种“搜索”将是快速而简单的; HashSet
可以很好地完成工作。
private HashSet<Host> hosts;
private HashSet<Host> immune;
private HashSet<Host> infectious;
public void killHost(Host deadManWalking) {
hosts.remove(deadManWalking);
immune.remove(deadManWalking);
infectious.remove(deadManWalking);
}
这真的很简单,并且会在O(lg n)时间内发生。 (虽然您必须覆盖equals
实施中的hashCode
和Host
方法;但这在技术上并不具有挑战性。)
我对C ++的回忆对我来说太朦胧了,无法对这两种语言进行任何权威的比较。我在大学里做了大量的C ++工作,从那时起就没有碰过它。 C ++代码会运行得更快吗?做得对,并假设你没有任何内存泄漏,我怀疑它会,虽然Java的代表作为一种缓慢的语言主要是从它的年轻人的保留;这些天很不错。更容易写?好吧,假设你正在学习这门语言,可能不是。但是从C ++到Java的学习曲线非常温和,我个人根本不会错过C ++。一旦你了解了这些语言,在我看来,Java就更容易使用了。 YMMV,natch,但它可能值得为你付出努力。
答案 2 :(得分:0)
实际上,你的印象基本上是倒退的:当没有任何指针可以访问该对象时,Java会假定一个对象(在这种情况下是主机)已经死了。此时它会自动清理对象。
然而,猜测是,有一个“拥有”主机的集合,并且负责在主机死亡时删除它。其他指向主机的指针不拥有它。如果是这种情况,那么在C ++中,您通常会通过让“拥有”集合包含shared_ptr
到主机来处理此问题,而其他集合包含weak_ptr
到主机。要通过weak_ptr
使用该对象,您必须先将其转换为shared_ptr
,您可以取消引用以访问主机本身。但是,如果该对象已被删除,则将weak_ptr
转换为shared_ptr
的尝试将失败,并且您将知道主机已死(然后您可以删除对它的引用)