我的特定基于代理的模型(ABM)的Java或C ++?

时间:2010-03-10 19:23:33

标签: java c++

遗憾的是,我需要开发一个基于代理的模型。我的背景是C ++;我很体面但不是专业的程序员。我的目标是确定,暂时不考虑我的背景,使用C ++或Java编写以下类型的算法会更快或更容易。

  1. 我的代理人将是班级Host。他们的私人成员变量包括他们对不同菌株的感染和免疫状态(类型int)。 (在C ++中,我可能会使用unordered_mapvector来保存此信息,具体取决于应变的数量。)我计划跟踪向量中的所有主机vector< Host *> hosts
  2. 该程序需要随时了解感染特定菌株或对特定菌株具有免疫力的所有特定宿主。对于每个菌株,我可以因此保持两个独立的结构,例如vector< Host *> immune vector< Host *> infectious (我可能会使每个二维结构,通过菌株索引,然后是宿主)。
  3. 主人可能会死。这似乎在C ++中造成混乱,因为我必须在host中找到合适的人物并在其他结构(immuneinfectious中搜索)以查找所有结构指向此对象的指针。 我的印象是,如果删除底层对象,Java将隐式删除所有这些指针。这是真的吗?在C ++中使用比我这里更好的方法吗?

提前感谢您的帮助。


我应该补充一点,如果我使用C ++,我将使用智能指针。也就是说,当对象需要时,我仍然没有看到删除指向对象的所有指针的方式。 (当主机死机时,我想从内存中删除它。)

我意识到在Java中需要学习很多东西。我希望有人能够更多地了解语言之间的差异,以及谁能理解我需要做什么(上图),可以告诉我一种语言是否显然比另一种语言更有效。

3 个答案:

答案 0 :(得分:1)

我无法回答你的所有问题,但是

  

我的印象是,如果删除底层对象,Java将隐式删除所有这些指针。

在Java中,您不删除对象;相反,当它的引用计数变为零时,它会被有效删除。但是,您可能希望在此使用weak references;这样,当强引用计数变为零时,对象就会消失。

答案 1 :(得分:1)

我的印象是,如果删除底层对象,Java将隐式删除所有这些指针。这是真的?

不。你实际上倒退了;如果删除所有指针,Java将删除基础对象。因此,您仍需要搜索所有三个数据结构(hostsimmuneinfectious)以杀死该特定主机。

但是,如果您使用正确的数据结构,这种“搜索”将是快速而简单的; 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实施中的hashCodeHost方法;但这在技术上并不具有挑战性。)

我对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的尝试将失败,并且您将知道主机已死(然后您可以删除对它的引用)